0

私は子プロセスでこれを行っています:execlp ("wc", "wc" ,filename,"-l", NULL)パイプ内の出力をリダイレクトして、親プロセスから読み取ります。

すべて正常に機能していますが、wcオプションが指定されたファイル名を見つけられない場合、無限ループが発生します。検索オプションと同じこと。

の出力を確認するにはどうすればよいですexeclpか、またはこの無限ループに入らないようにするにはどうすればよいですか?

これは、フォークで作成された子のコードです。

close(1); 
if (dup (pipeCom[1]) != 1) 
{
 fprintf (stderr, "dup - 1\n");
 exit (1);  
}
execlp ("wc", "wc" ,filename,"-l", NULL);`

これは親プロセスのコードです:

wait();
if ((num = read(pipeCom[0],&out,200))==0)   
perror("pipe error");   
else {
     out[num] = '\0';
     }
printf("%s",out);
4

1 に答える 1

1

Jonathan は、dup2() と「-l」オプションの位置について完全に正しいです。そうは言っても、SSCCEは次のようになります。

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
        const char *filename = "/etc/passwd"; /* whatever */
        int pipeCom[2];
        char out[200];
        int num, status;
        if(pipe(pipeCom)) {
                perror("pipe");
                return 111;
        }
        if(argv[1])
                filename = argv[1];
        switch(fork()) {
        case -1:
                perror("fork");
                return 111;
        case 0:
                /* child */
                close(1);
                if (dup (pipeCom[1]) != 1)
                {
                        fprintf (stderr, "dup - 1\n");
                        exit (1);
                }
                execlp ("wc", "wc" ,filename,"-l", NULL); /* Jonathan! */
                perror("wc");
                return 111;

        default:
                /* parent */
                wait(&status);
                if ((num = read(pipeCom[0],&out,200))==0)
                        perror("pipe error");
                else {
                        out[num] = '\0';
                }
                printf("%s",out);
                break;
        }
        return 0;
}

パラメータなしの wait() のため、元のコードはコンパイルさえしません。それを修正するだけで、私のシステムでコンパイルして動作するプログラムにつながったので、問題を引き起こしているコードを正確に投稿して、コンパイル/実行方法と正確何が失敗しているのかを説明できますか? 私の直感では、あなたの場合は filename==NULL であることがわかりますが、その場合は、想像するよりもプログラムで読み取る方がはるかに優れていたでしょう ;p

于 2013-10-20T14:05:11.333 に答える