C странной аномалией при записи в файл (работает нормально при записи в stdout) - PullRequest
5 голосов
/ 05 июня 2011

Я очень плохо знаком с C, поэтому, пожалуйста, потерпите меня. Я борюсь с этим очень долго, и мне было трудно найти причину ошибки.

Я заметил, что при разветвлении процесса и записи в файл (только исходный процесс записывает в файл странную вещь, выходной сигнал почти умножается на количество разветвлений, что трудно объяснить, поэтому я сделал небольшой тестовый код где вы можете запустить, и это воссоздает проблему.

#include <stdio.h>
#include <stdlib.h>


void foo()
{
  FILE* file = fopen("test", "w");
  int i=3;
  int pid;
  while (i>0)
  {
    pid=fork();
    if(pid==0)
    {
      printf("Child\n");
      exit(0);
     }
    else if(pid > 0)
    {
      fputs("test\n", file);
      i=i-1;
     }
 }

}

int main()
{
  foo();
  exit(EXIT_SUCCESS);
}

Скомпилируйте и запустите его один раз, как есть, и один раз с file=stdout. При записи в stdout вывод:

test
test
test

Но при записи в файл вывод:

test
test
test
test
test
test

Также, если вы добавите индексирование и измените i на большее число, вы можете увидеть какой-то шаблон, но это мне не поможет.

Честно говоря, я не знаю, почему это могло произойти, и как это исправить. Но я абсолютный новичок в C, поэтому для всего этого может быть только нормальное логическое объяснение.

Спасибо за ваше время и ответы.

1 Ответ

8 голосов
/ 05 июня 2011

stdout обычно небуферизован или буферизован строкой;другие файлы обычно имеют блочную буферизацию.Вам нужно fflush() их до fork(), иначе каждый дочерний элемент сбросит свою собственную копию буфера, что приведет к умножению.

...