2012-06-24 3 views
1

Можно создать дубликат:
Are file descriptors shared when fork()ing?Линуксом вилочные и системные ресурсы

Предположим, что у меня есть следующий код в Linux:

int main() 
{ 
    FILE* f = fopen("file.txt", "w"); 
    fork(); 
    fwrite("A", 1, 1, f); 
    fclose(f); 
    return 0; 
} 

Что я знаю о fork из документации, является что он делает копию текущего процесса. Он также копирует состояние памяти, поэтому * f должен быть равен в обоих случаях. Но что происходит с системными ресурсами, такими как дескриптор файла? В этом примере я открываю файл с намерениями записи, поэтому только один экземпляр может записывать в файл, не так ли? Какой из экземпляров будет фактически записываться в файл? Кому нужно позаботиться о дескрипторе файла и вызвать fclose()?

ответ

1

Оба процесса получают ручку. Оба могут писать, но будут делиться текущим смещением. Оба должны закрываться, каждый закрывает свою ручку.

+0

unbeli, правильно ли, если вызывать exec() после fork() (скажем, в дочернем процессе), то все общие ресурсы в дочернем процессе будут правильно закрыты, как если бы приложение было просто прекращено? –

+0

@DmitryBespalov хорошо, они не будут закрыты на exec() (если вы не установите FD_CLOEXEC), но они будут закрыты, когда ребенок закончит, конечно. Но это не повлияет на дескрипторы родителя, они останутся открытыми до тех пор, пока вы их не закроете или родитель не закончит. – unbeli

Смежные вопросы