Дочерний процесс никогда не выполняется после fork - PullRequest
0 голосов
/ 24 октября 2019

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

Вот фрагмент:

char response[10];
pid_t pid = fork();
int p[2];
pipe(p);
if(pid!=0)
{
    char username[255];
     CutString(8,command,username); // a function of mine i verified 
     write(p[1],username,sizeof(username));
     close(p[1]);
     wait(NULL);
     read(p[0],response,8);//the answer is always 8 bytes
     close(p[0]);
}
else //never gets here
{
     char buffer[255];
     size_t bufferIndex=0;
     char ch;
     while (ch != '\0')
     {
         read(p[0],&ch,1);
         buffer[bufferIndex++]=ch;
     }
     close(p[0]);
     f=fopen("config.txt","r");
     write(p[1],SearchInFile(f,buffer),8);
     close(p[1]);
}

1 Ответ

3 голосов
/ 24 октября 2019

В «дочерней» части вышеприведенного кода есть несколько ошибок, в результате чего он выполняется быстро, без побочных эффектов, а затем завершается.

  1. The while (ch! = 0) 'полагается на неинициализированный 'ch' var. В моей сборке (cc -g) ch инициализируется нулем, что приводит к нулевому выполнению цикла while.
  2. Нет теста, чтобы проверить, действительно ли работает fopen (config.txt). Если он не существует, код может произойти сбой.
  3. В момент записи в p [1] (запись (p [1]), входная часть (p [0]) уже закрыта. Скорее всегов результате SIGPIPE.

Дополнительный комментарий: неясно, что пытается сделать программа.

РЕДАКТИРОВАТЬ 2019-10-25:

Возможные дополнительные проблемы:

  1. Если неинициализированный ch (в дочерней части) начинается с ненулевого значения, код может перейти в режим ожидания навсегда в операторе read, поскольку в канал ничего не записано.
...