我有这段代码
static void sigXCPU(int pTmp){
cout<<" .... ";
}
.....
pid_t vPid=fork();
int vStat;
switch(vPid){
case -1: perror("fork");
exit(1);
case 0:
//limit on data
struct rlimit vLimD;
vLimD.rlim_cur = 100000;
vLimD.rlim_max = 1000000;
setrlimit(RLIMIT_DATA, &vLimD);
//limit on cpu time
struct rlimit vLimCPU;
vLimCPU.rlim_cur = 1;
vLimCPU.rlim_max = 1;
execl("./p1","",NULL);
if(signal(SIGXCPU,sigXCPU)==SIG_ERR);
break;
default:
while(wait(&vStat)!=vPid);
break;}
,p1的代码是
int main(){
sleep(10);
return 0;}
为什么孩子会忽略SIGXCPU?代码是在FreeBsd 8.0 amd64下使用gcc编译的。
答案 0 :(得分:3)
execl
之后的子代码永远不会被执行,因为当前的过程映像被p1
中的应用程序替换。
即使您将信号处理程序置于execl
之前,它也会被覆盖,因为在exec之后信号处置会重置为默认值。毕竟,新的过程映像中将不再存在处理函数。
最后,要设置信号处理程序,请避免使用signal
并使用sigaction。