1

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

我不确定为什么它只运行两次然后退出。

4

0 回答 0