1

私は現在IPCを勉強しています、私は最初のプログラムを持っています

A:Bの実行を実行し、待機します

B:FIFOを介して3番目のプログラム「C」から文字列を受信し、それをAに再送信する必要があります

execの前にAでパイプを開き、引数としてfd[1]をBに渡すことを考えていました。

if(pipe(fd)==-1){
    perror("Pipe Failed");
    myExit(EXIT_FAILURE);
}

close(fd[1]);   
sprintf(fdString,"%d",fd[1]);

    .......

if((int)(pid=fork())>0)

    waiting(status);    

else if(pid==0){    

    close(fd[0]);   

    execl("./B","B",fdString,(char*)0);
    perror("Exec failed");
    myExit(EXIT_FAILURE);

}

次にBで:

int fd=atoi(argv[1]);

    //Receive string from C 

    len=strlen(string)+1;

if(write(fd,&len,sizeof(int))==-1){
    perror("Error on writing length");
    exit(EXIT_FAILURE); 
}

if(write(fd,string,len)==-1){
    perror("Error on writing string");
    exit(EXIT_FAILURE);     
}

私の問題は、Aでこの文字列を読み取ることです。文字列がパイプのBによって書き込まれ、Aに次のようなものがあるとすぐに、SIGUSR1をAに送信することを考えていました。

signal(SIGUSR1, signalHandler);
    ........
    static void signalHandler(int signo){
    switch(signo){
    case SIGUSR1:
        listen();
        break;
    default: break;

    }
}
    ........
static void listen(){

    int len;

    if(read(fd[0],&len,sizeof(int))<sizeof(int)){
        perror("Error reading len");
        myExit(EXIT_FAILURE);   
    }

    char string[len];

    if(read(fd[0],&string,len)<len){
        perror("Error reading string");
        myExit(EXIT_FAILURE);   
    }
    printf("String: %s with length %d\n", string, len);
}

しかし、私が得るのは 「lenの読み取りエラー:成功」です。何が問題なのですか?

私の英語が下手な場合は申し訳ありませんが、助けていただければ幸いです。

4

2 に答える 2

1

文字列を書き込むプログラムは、次の行のためにセグフォールトしている可能性が非常に高くなります。

if(write(fd,&string,len)==-1) { /* ... */

あなたが通過する必要があるstring ので&

一方、エラーメッセージは、おそらく0バイトread()以下を返すため、あまり有益ではありません。戻り値が。の場合にsizeof(int)のみ設定されます。通常、0以下を返すという事実は、ファイルの終わりの状態を意味します。つまり、もう一方の端がパイプを閉じています。errno-1read()

さらに掘り下げる前に、これらの問題を修正する必要があります。

于 2012-07-18T14:16:25.530 に答える
0

私は実際に自分の問題を解決したので、自分で答えています:

fork()の前にfd [1]を閉じました。これにより、エタノール(C2H5OH;))が言ったように、fd [1]を閉じた(読み取りでエラーが発生します!)子が発生します。

私は彼の答えを受け入れています。なぜならそれは私を解決に導いたからです!

于 2012-07-18T22:23:10.250 に答える