我必须编写一个shell,它能够打印关于信号终止过程的信息"如果命令被信号终止。
实施例
> sleep 5
^C terminated by signal 2
> sleep 10 &
background pid is 4422
..... // after several lines
background pid is done: exit value 0
> sleep 11 &
background pid is 4442
> kill -15 4442
background pid is done: terminate by signal 15
但是,在我的代码中:
1)如果^C
中的sleep 5,
它直接从shell退出而不是仅终止睡眠过程。
2)如果我输入sleep 10 &
,它会直接打印background pid is 4422: exit value 0
。因此,我认为这里没有睡觉,我也无法执行kill -15 <process id>
。
我最好猜测它与我的launch
函数有关(很多人建议使用此函数启动程序并等待它终止)和这是它的样子:
注意:我有一个名为runBg
的全局变量,实际上我是为测试人员创建的,如果存在后台进程,那么我将runBg
设置为1.但是,我不知道这是不是一个好主意。
int launch(char **args) {
pid_t pid;
int status;
int exitStat = 0;
pid = fork();
if (pid == 0) {
if (execvp(args[0], args) == -1) {
printf("error1"); // debugging purposes
exit(EXIT_FAILURE);
}
} else if (pid < 0) {
printf("error2"); // debugging purposes
} else {
do {
if (runBg == 0) {
waitpid(pid, &status, WUNTRACED);
} else if (runBg== 1) {
waitpid(-1, &status, WNOHANG);
}
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
}
if (runBg== 1) {
printf("Background PID: %d is done: exit value: %d", pid, exitStat);
}
if (status != 0 || WIFSIGNALED(status)) {
exitStat = 1;
}
return exitStat;
我尝试进行多次测试,但这一切似乎直接落入error1
。
第一个if条件execvp ......
是麻烦制造者吗?
sleep 15 &
似乎也不起作用,因为在do-while循环之后它不会转到最后if statement
吗?
期待你的帮助。如果我错过了这个帖子中的信息,请告诉我。谢谢。