gpt4 book ai didi

c++ - Linux 管道、fork 和 execlp : how to get the value written into stream 1

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:08 25 4
gpt4 key购买 nike

我使用函数 (L) 通过 execlp() 执行另一个程序 (K)。K程序中,结果写入流1:

write(1, (char *)&o, sizeof(int));

由于execlp()之后,L的剩余部分不会执行,如何才能得到stream 1中写入的结果呢?

不要问我为什么要这样做。这是一个项目的要求。

我听从了你们的建议,但现在的问题是,K 程序从流(一个标准流,另一个流)获取参数的方式,我正在使用管道将参数写入相应的流(已完成由 parent )。

在子 exec 之后,在父部分,我从流 0 读取(K 程序将其结果写回流 1)。但是我能得到的是父进程写入流的内容,而不是 K 程序写回的内容。怎么了?我需要添加另一个管道吗?

谢谢!!

最佳答案

Jonathan Leffler 在他的评论中提到的关键见解是,在调用 execlp() 之前,您需要fork 正在运行 L 的程序

fork之后,parent继续执行L的剩余部分,child通过调用execlp()变身为程序K >,除非出现错误,否则永远不会返回。

因此,“L 的剩余部分不会被执行”的断言是不正确的。如果您正确编写函数 L,它在父进程中执行。

更新:由于 OP 使他的问题更加具体,我将附加到这个答案。

如果想取回子进程写到stdout(fd 1)的内容,需要在fork之前新建一个管道,将这个管道的写入端复制到子进程的标准输出

这是一个示例程序,对 pipe man page 稍作修改.

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int
main(int argc, char *argv[])
{
int pipefd[2];
pid_t cpid;
char buf;

if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}

cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}

if (cpid == 0) { /* Child writes into the pipe */
close(pipefd[0]); /* Close unused read end */

// Copy the writing end of the pipe into STDOUT for the child.
dup2(pipefd[1], STDOUT_FILENO);

// Execute your program L here, and its stdout will be captured by the pipe.
const char* message = "Child is speaking to stdout!";
write(STDOUT_FILENO, message, strlen(message));
write(STDOUT_FILENO, "\n", 1);


close(pipefd[1]);
_exit(EXIT_SUCCESS);

} else { /* Parent reads child's stdout from the pipe */
close(pipefd[1]); /* Close unused write end */

// Here the parent process is reading the child's stdout.
while (read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
}
}

关于c++ - Linux 管道、fork 和 execlp : how to get the value written into stream 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23418630/

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