gpt4 book ai didi

c - C 中后台子进程的无效命令

转载 作者:行者123 更新时间:2023-11-30 17:13:06 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com