如何通过子进程取消alarm()信号?

Suk*_*uki 3 c signals child-process alarm

对于作业,我正在创建一个时间感知的shell.如果shell运行超过一定的时间,它会分叉并执行命令并将其杀死.例如.

 input# /bin/ls
 a.out code.c
 input# /bin/cat
 Error - Expired After 10 Seconds.
 input#
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是:如果在程序处理过程中出现错误,也就是说,当exevce返回-1时,有没有办法阻止警报启动?

由于儿童过程分开进行,经过数小时的实验和研究后,我还没有找到任何讨论甚至暗示这类任务的内容,我觉得这可能是不可能的.如果确实不可能,我怎么能防止发生以下事情......

 input# /bin/fgdsfgs
 Error executing program
 input# Error - Expired After 10 Seconds.
Run Code Online (Sandbox Code Playgroud)

对于上下文,这里是我正在使用的代码,我自己尝试删除这些代码.我在这里先向您的帮助表示感谢!

while(1){
    write(1, prompt, sizeof(prompt)); //Prompt user
    byteCount = read(0, cmd, 1024); //Retrieve command from user, and count bytes
    cmd[byteCount-1] = '\0';    //Prepare command for execution

    //Create Thread
    child = fork();

    if(child == -1){
        write(2, error_fork, sizeof(error_fork));
    }

    if(child == 0){ //Working in child
        if(-1 == execve(cmd,arg,env)){  //Execute program or error
            write(2, error_exe, sizeof(error_exe));
        }   
    }else if(child != 0){   //Working in the parent
        signal(SIGALRM, handler);   //Handle the alarm when it goes off
        alarm(time);
        wait();
        alarm(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

C2H*_*5OH 6

根据手册页:

描述

alarm()函数将使系统在经过秒指定的实时秒数后,为进程生成SIGALRM信号.处理器调度延迟可能会阻止进程在生成信号后立即处理信号.

如果seconds为0,则取消挂起的警报请求(如果有).

报警请求没有堆叠; 只能以这种方式安排一个SIGALRM生成.如果尚未生成SIGALRM信号,则呼叫将导致重新安排生成SIGALRM信号的时间.

未指定alarm()与任何setitimer(),ualarm()或usleep()之间的交互.

所以,取消警报:alarm(0).它甚至出现在您的示例代码中.

主要问题

顺便说一下,你在这里错过了一个重要的部分:

if(child == 0){ //Working in child
    if(-1 == execve(cmd,arg,env)){  //Execute program or error
        write(2, error_exe, sizeof(error_exe));
        _exit(EXIT_FAILURE);  // EXIT OR A FORKED SHELL WILL KEEP GOING
    }   
}else if(child != 0){   //Working in the parent
Run Code Online (Sandbox Code Playgroud)