2015-03-26 3 views
0

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

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 является функция, которая возвращает текущий текущий идентификатор процесса), но он этого не делает, он ничего не выводит при вызове. что я сделал не так?

+0

Я не думаю, что 'wait (0);' разрешен. Я не нашел на страницах man, что один может передать указатель NULL на 'wait()' –

+0

, ожидание (0) разрешено, потому что это xv6 и не нормально linux ... – Tai

ответ

1

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

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

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

Edit: это работает на 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); 
} 
+0

Я переместил close (p [1]), и он все еще не работает. У ребенка есть выход внутри него (в runcmd) ... Так что это не то, что вызывает проблему. – Tai

+0

Что происходит на самом деле? выполняет 'read()' зависает или возвращает 0? –

+0

Он возвращает 0 и не читает – Tai

0

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