Передача канала между родителем и дочерним элементом внутри функции

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

int p[2];
int i;
pipe(p);
close(p[1]);
if(fork1() == 0){
  close(p[0]);
  runcmd(parsecmd(buf),p);
}
wait(0);
}
while(read(p[0],&i,sizeof(int)) != 0){
printf(1," id: %d\n",i );}

и runcmd будет иметь следующий код:

...
void runcmd(struct cmd *cmd,int pp[]){
int j = getpid();
write(pp[1],&j,sizeof(int));
close(pp[1]);
...

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

2 ответа

Вы закрываете сторону записи канала перед разветвлением, чтобы дочерний процесс не мог записать в него. Вам также нужно exit() ребенок. Так что ваш код должен быть чем-то вроде как это:

pipe(p);
if(fork1() == 0){
   close(p[0]);
   runcmd(parsecmd(buf),p);
   exit(0);  
}
close(p[1]);
...

Кроме того, я бы порекомендовал добавить немного обработки ошибок (fork() может также вернуть -1)`

Изменить: это работает в Linux

void runcmd(int pp[])
{
    int j = getpid();
    write(pp[1],&j,sizeof(int));
    close(pp[1]);
    exit(0);
}

int main( int argc, char *argv[] )
{
    int p[2];
    int i;
    int status;

    pipe(p);
    if(fork() == 0){  // for linux: fork() instead of fork1()
       close(p[0]);
       runcmd(p);
    }
    close(p[1]);      // close belongs here
    wait(&status);    // Linux: wait(0) is not allowed
    while(read(p[0],&i,sizeof(int)) > 0)  // != 0 causes endless loopn on EOF
    {
         printf(" id: %d\n",i );   // first parameter '1' doesn't belong there
    }
    return( 0 );
}

Проблема была решена!
неприятной частью был тот факт, что цикл while был после вызова "wait", а не раньше, после изменения того, что он работает как по волшебству!
Спасибо за помощь!

Другие вопросы по тегам