c++ - 消失的子进程

标签 c++ exec fork pipe dup2

我有这个方法:

int build_pipe_and_call(char **argv1, std::string cmd1, char **argv2, std::string cmd2, int conc) {
    std::cout << "Building Pipe...\ncmd1: " << cmd1 << "\n cmd2: " << cmd2 << "\n";
    int *pipefd = new int[2];
    if (pipe(pipefd) < 0) {
        std::cerr << "There was an error setting up the pipe.\n";
        return -1;
    }
    pid_t cpid1 = fork();
    std::cout << "First process forked, cpid: " << cpid1 << " - Process " << getpid() << "\n";
    switch (cpid1) {
        case -1:
            std::cerr << "There was an error forking the process.\n";
            return -1;
            break;
        case 0: // this is the part that isn't executing
            std::cout << "Dup2 return: " << dup2(pipefd[1], 1) << "\n";
            std::cout << "Process " << getpid() << " duped and about to exec.\n";
            execvp(cmd1.c_str(), argv1);
            std::cout << "Process " << getpid() << " about to exit.\n";
            _exit(0);
            break;
        default:
            pid_t cpid2 = fork();
            switch (cpid2) {
                case -1:
                    std::cerr << "There was an error forking the process.\n";
                    return -1;
                    break;
                case 0:
                    dup2(pipefd[0], 0);
                    std::cout << "Process " << getpid() << " duped and about to exec.\n";
                    execvp(cmd2.c_str(), argv2);
                    _exit(0);
                    break;
                default:
                    if (conc) {

                    } else {
                        int status1, status2;
                        std::cout << "Process " << getpid() << " about to wait.\n";
                        waitpid(cpid1, &status1, 0);
                        waitpid(cpid2, &status2, 0);
                    }
                    break;
            }
        }
    delete[] pipefd;
    return 0;
}

我添加打印语句只是为了调试。但是,当此方法运行时,这就是打印的内容。

Building Pipe...
cmd1: cat
cmd2: wc
First process forked, cpid: 1454 - Process 1453
First process forked, cpid: 0 - Process 1454
Process 1453 about to wait.
Process 1455 duped and about to exec.

进程 1454 是第一个派生的进程,它在创建后立即打印消息。但是,它从不打印来自 switch 语句的任何消息,也从不执行指定的程序(在本例中为 cat)。该进程不会像僵尸一样徘徊,它只是消失了。结果,第二个子进程挂了,实际上什么也没做。

(另外,补充一下,我知道我还没有添加所有适当的错误处理,功能还没有完成)。

最佳答案

您没有看到来自 switch 语句的消息,因为它们已被写入管道。尝试将 std::cout 替换为 std::cerr

关于c++ - 消失的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26209218/

相关文章:

c++ - 将类实例移至类成员后无法初始化类实例?

C fork 循环执行无限命令(事件文件上的 urandom/tail)

c - 双核字数统计速度慢

PHP 可执行文件将在命令行中运行,但不能在浏览器中运行

c++ - 如何在最后一个子 fork() 下打印一次子进程及其名称和 pid

c - 如何在 C 中使用 fork() 和 execvp() 创建多个有序进程?

.net - GeoTrans p/调用包装器 NullReferenceException

c++ - 运用reinterpret_cast来操作字节

c++ - 抽象类使用shared_ptr时如何在nm或objdump中找到函数符号?

linux - 为什么 exec.Start() 创建的进程在其父进程被 SIGINT 杀死时退出?