bugfix> c > 投稿

次のコードでエラーが発生しています。 奇数に関連するハンドラのみを実行します(親が1〜10の奇数の乱数を生成する場合)が、偶数のハンドラは常に「ミュート」です。 誰かが私を助けてくれますか?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <signal.h>
#include <math.h>
pid_t pid1,pid2;
int r, ric1, ric2;
int fd[4];  //per 2 processi figli
void handler_one(){
    read(fd[0], &ric1, sizeof(int));
    printf("Im the first child process...the even received numebr is...%d\n", ric1);
    sleep(1);
}
void handler_two(){
    read(fd[2], &ric2, sizeof(int));
    printf("I'm the second child process...the odd receiver number is...%d\n", ric2);
    sleep(1);
}
void main(){

    pipe(fd);
    pipe(fd+2);
    pid1=fork();
    if(pid1)
        pid2=fork();
    while(1){
        if(pid1<0 || pid2<0){
            perror("AN ERROR OCCURRED!!!!!!!\n");
            exit(1);
        }
        else if(!pid1 && pid2){ //child #1
            signal(SIGUSR1, handler_one);
        }
        else if(pid1 && !pid2){ //child #2
            signal(SIGUSR2, handler_two);
        }
        else{   //padre
            printf("I'm the parent and I'm gonna send a random number\n");
            r=rand()%10+1;
            if(r%2==0){
                write(fd[1], &r, sizeof(int));
                kill(pid1, SIGUSR1);
            }               
            else{
                write(fd[3], &r, sizeof(int));
                kill(pid2, SIGUSR2);
            }
            sleep(1);
        }
    }
}

回答 1 件
  • 子1シグナルハンドラーをセットアップするための条件が正しくありません。の代わりに

      else if(!pid1 && pid2){ //child #1
    
    

    そのはず

      else if(!pid1 && !pid2){ //child #1
    
    

    pid1とpid2がゼロに初期化されることが保証されているかどうかはわかりませんが、明示的に行ってください。

あなたの答え