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)
根据手册页:
描述
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)