我在 C 中有以下代码:
if ((childpid = fork()) == 0) {
if (execvp(argv[0], argv) < 0) {
//execute failed
exit(1);
}
} else if (childpid < 0) {
//fork failed
} else {
//if execvp failed don't do anything here
//else do something
}
我想要的是:
我输入一个命令。
如果它不可执行,它不应该执行任何操作,而是等待我下一个输入的命令。
如果它是可执行的,它应该在父进程中执行一些操作。
如果我输入例如sleep 1m
它应该在我的子进程中执行它,在父进程中执行操作,并且应该仍然能够执行更多作业(这很好)。但是,当我执行像 abcdef
(无效命令)这样的命令时,它无论如何都会在我的父进程中执行这些操作。
有人可以告诉我代码应该是什么样子吗?
我还尝试了以下方法:
void signalHandler(int signal)
{
if (signal==SIGCHLD) {
printf("Child ended\n");
wait(NULL);
}
}
//in main
signal(SIGCHLD,signalHandler);
//...
if ((childpid = fork()) == 0) {
if (execvp(t_argv[0], t_argv) < 0) {
kill(getppid(),SIGCHLD);
}
}
这是正确的吗? 这样我之后就会收到错误(当完成时)。
waitpid(childpid, &status, WNOHANG)
告诉我它完成时出现错误 (-1)。
最佳答案
一种可能的解决方案是使用一对匿名管道,子进程在管道的写入端写入它需要传递给父进程的任何状态。然后在父进程中检查管道的读取端,如果在子进程退出之前没有收到任何内容,则一切正常,子进程成功执行了程序。
如果父进程在子进程退出之前收到任何内容,则意味着 exec
调用失败。
关于c - C 中后台子进程的无效命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31048374/