Можно создать дубликат:
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()?
unbeli, правильно ли, если вызывать exec() после fork() (скажем, в дочернем процессе), то все общие ресурсы в дочернем процессе будут правильно закрыты, как если бы приложение было просто прекращено? –
@DmitryBespalov хорошо, они не будут закрыты на exec() (если вы не установите FD_CLOEXEC), но они будут закрыты, когда ребенок закончит, конечно. Но это не повлияет на дескрипторы родителя, они останутся открытыми до тех пор, пока вы их не закроете или родитель не закончит. – unbeli