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

标签 c process fork parent execvp

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

相关文章:

github - 我可以将 Codeplex 存储库 fork 到 GitHub 吗?

c - Linux Fork 进程终止

c - 如何设置 Autoconf 项目以使用 GTK 进行制作?

c - C 中的指针和动态内存分配

linux - Linux进程了解父级<>子级

python - 如何使用 python 显示当前用户的进程列表?

linux - 多线程fork

c - timer_settime 在 uClinux 上的 pthread 中调用处理函数

c - 验证 scanf 条目

python - 如何为每个目录创建一个进程?