1

こんにちは。LINUX SIGIO シグナルを処理するために、「C」スレッド関数とシグナル ハンドラを組み合わせたものを次に示します。私が直面している問題は、テスト プログラムを初めて実行したときに、この関数が SIGIO シグナルを正しく処理して認識することです。ただし、その後 (2、3、4...) では、この関数は SIGIO を正しく認識できません。私の仮説は、この動作は /proc//fdinfo/1" ファイルのライフ サイクルと関係があるというものです。/proc//fdinfo/1" ファイルのライフ サイクルの詳細と、仮説は正しい。どうもありがとうございました。

void *reader(int signal)
{
    pid_t pid1,pid2;
    int status;
    int fd[2];
    char buf[256];
    char buffer[256];
    char filename[256];
    int myfd;
    int length;
    struct rusage usage;

    printf("SIGNAL = %d\n",signal);

    length = 256;
    if (signal == 0){
        return NULL;
    }

    pipe(fd);
    if ((pid1 = fork())) {
                sprintf(filename,"/proc/%d/fdinfo/1",pid1);
//              printf("UNLINK = %d\n",unlink(filename));
                myfd = open(filename,O_RDONLY);
                if (myfd == -1){
                        printf("myfd = %d filename = %s\n",myfd,filename);
                        printf("errno = %d\n",errno);
                }
                int myretval = mmap(NULL,
                                    length,
                                    PROT_READ|PROT_WRITE,
                                    MAP_ANONYMOUS|MAP_SHARED,
                                    myfd,
                                    0);
                printf("myretval = %d\n",myretval);
                fcntl(0,F_SETFL,F_SETOWN);
                fcntl(1,F_SETFL,F_SETOWN);
                       fcntl(2,F_SETFL,F_SETOWN);
                fcntl(3,F_SETFL,F_SETOWN);
                if (signal == SIGIO){
                        printf("SIGNAL SIGIO RECEIVED");
                }
                close(fd[WRITE]);
                FILE *read = fdopen(fd[READ],"r");
                while (!feof(read)) {
                        fgets(buf,256,read);
                //      printf("child says: %s",buf);   
                }
                pid2 = wait3(&status,0, &usage);
   }
   else {
                close(fd[READ]);
                close(fileno(stdout));
                dup(fd[WRITE]);
                //  child only unblock mask

                fcntl(0, F_SETFL, O_ASYNC);
                fcntl(1, F_SETFL, O_ASYNC);
                fcntl(2, F_SETFL, O_ASYNC);
                fcntl(3, F_SETFL, O_ASYNC);
                printf("WE ARE HERE\n");
                execl("/h/fchang03/five","five",NULL);

  }

}
4

0 に答える 0