|
|
|
|
|
|
|
[Original]
[Print]
[Top]
|
父进程使用sigtimedwait等待子进程退出发出的SIGCHILD信号,但在redhat上出现问
题,sigtimedwait会一直等待或者timeout,而子进程其实已经退出,测试代码见以
下,在HP-UX没问题,在redhat上如果父进程给SIGCHLD加一个handler,sigtimedwait
就能等到SIGCHLD信号(即取消以下代码的注释部分),请教各位原因是什么。
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
/*static void a(int sig){
puts("SIGCHLD handler");
}*/
static void timedWaitForChild(pid_t _iChildPid, time_t _iTimeout) {
sigset_t sigSet;
struct timespec tms;
siginfo_t info;
tms.tv_sec = _iTimeout;
tms.tv_nsec = 0;
/*signal(SIGCHLD,a);*/
sigemptyset(&sigSet);
sigaddset(&sigSet, SIGCHLD);
printf("waiting for SIGCHLD
");
if(SIGCHLD != sigtimedwait(&sigSet, &info, &tms)){
if (EAGAIN == errno) {
perror("time out");
return ;
} else {
perror("sigtimedwait");
return ;
}
}else {
printf("get SIGCHLD
");
return ;
}
return ;
}
static void* threadMain(void* p) {
sigset_t mask;
pid_t childPid;
sigemptyset(&mask);
sigaddset(&mask,SIGCHLD);
pthread_sigmask(SIG_UNBLOCK,&mask,NULL);
fflush(NULL);
childPid = fork();
if(childPid < 0 ){
perror("fork");
pthread_exit(NULL);
}
if (0 == childPid) {
sleep(2);
printf("child exit
");
fflush(NULL);
_exit(0);
}
timedWaitForChild(childPid, 10) ;
pthread_exit(NULL);
}
int main(int argc,char** argv){
sigset_t mask;
pthread_t transThread;
sigemptyset(&mask);
sigaddset(&mask,SIGCHLD);
pthread_sigmask(SIG_BLOCK,&mask,NULL);
if(0 != pthread_create(&transThread, NULL, threadMain, NULL)){
perror(" pthread_create");
return 1;
}
sleep(15);
return 0;
}
|
|
|
[Original]
[Print]
[Top]
|
|
« Previous thread
mips汇编程序 |
CPU 与 编译器
第8页 |
Next thread »
编译错误 |
|