LINUX.ORG.RU

Дескрипторы файлов в дочерних процессах.


0

0

Проблема в следующем: 

открываем какой нибудь файл:
FILE* log;
log=fopen("my-log","w");
fprintf(log,"begin of file\n");
...

Потом создаем дочерний процесс:

if(pid=fork())
{
  fprintf(log,"Pid = %d\n",pid);
  exit(0)
}

Потом создаем еще несколько таких же процессов.
Процесс - родитель завершаем следующим образом:

...
fprintf(log,"End of file\n");
fclose(log);

В результате получаем содершимое файла log:

begin of file
begin of file
Pid=1051
begin of file
Pid=1052
...
begin of file
Pid=n
End of file

По моему это происходит из-за того, что файл log, открытый в родительском процессе, просто закрывается каждый раз при смерти дочернего процесса и все его содержимое заново сохраняется (в т.ч. и строка begin of file).

Не подскажет ли глубокоуважаемый all каким образом этого можно избежать, или как запускать дочерний процесс не передавая ему дескрипторы НЕКОТОРЫХ открытых в родительском процессе фалов без вмешивания exec.

Заранее спасибо 

flush

Вы забыли:
FILE* log;
log=fopen("my-log","w");
fprintf(log,"begin of file\n");
fflush(log); /* !!!!! */ 

yaroslav_v ()

Re: Дескрипторы файлов в дочерних процессах.

Thx. Все работает !!!

cbax ()

Re: Дескрипторы файлов в дочерних процессах.

Не все так просто при работе нескольких процессов с одним файлом. Если требования на атомарность операций ввода-вывода серьезные, следует посмотреть fcntl(2) и flock(2).

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.