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]);
...

悲しいことに、予想される結果は次のようになるはずです-親はIDを出力します(getpidは現在実行中のプロセスIDを返す関数です)が、呼び出されても何も出力されません。私は何を間違えましたか?

4

2 に答える 2

1

フォークする前にパイプの書き込み側を閉じて、子プロセスが書き込みできないようにします。あなたもexit()子供に必要です。したがって、コードは sth である必要があります。そのように:

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 );
}
于 2015-03-26T11:32:12.270 に答える