1我试图在 1 秒后杀死一个子进程。子进程是一个外部 c 程序,它运行一些嵌套的 for 循环,如果它通过,则打印“ALL DONE”。循环大约需要 10 秒,所以如果我正确设置了我的计时器和动作处理程序,它永远不会让它“全部完成”。
创建计时器后,子进程使用 execve 运行。
pid_t pid = -1;
void time_handler(int signal){
printf("in time_handler\n");
kill(pid, SIGKILL);
}
int main(int argc, char *argv[]){
char *const path = "/home/aidan/CSC252/a4/test";
char *const env_args[] = { (char*)0 };
pid = fork();
while(1==1){
if(pid == 0){ //in child
printf("in child\n");
struct sigaction sa;
struct itimerval *timer = malloc(sizeof(struct itimerval));
sa.sa_handler = &time_handler;
printf("sigaction: %d\n", sigaction(SIGVTALRM, &sa, NULL));
timer->it_value.tv_sec = 0;
timer->it_interval.tv_sec = 1;
printf("settimer: %d\n", setitimer(ITIMER_REAL, timer, NULL)); //start timer
//printf("getitimer: %d\n", getitimer(ITIMER_REAL, timer));
int exec = execve(path, NULL, env_args);
printf("Exec is %d\n", exec); //-1 = error
}
else if (pid > 0){//in parent
printf("in parent, pid: %d\n", pid);
printf("wait: %d\n", wait(NULL));
pid = 0;
}
}
}
sigaction 和 setitimer 都返回 0,但我不确定我实际上是否正确处理了计时器到期。我试着阅读
alarm(5);
但我的结果不成功。
当前输出为:
in parent, pid: 2362
in child
sigaction: 0
settimer: 0
In test
ALL DONE
wait: 2362
in child
sigaction: 0
settimer: 0
In test
ALL DONE
我不确定为什么它只运行两次然后退出。