こんにちは。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);
}
}