gpt4 book ai didi

c - 写入子进程文件描述符

转载 作者:太空狗 更新时间:2023-10-29 15:25:02 24 4
gpt4 key购买 nike

我有一个程序“示例”,它从标准输入和非标准文件描述符(3 或 4)获取输入,如下所示

int pfds[2];
pipe(pfds);
printf("%s","\nEnter input for stdin");
read(0, pO, 5);
printf("\nEnter input for fds 3");
read(pfds[0], pX, 5);

printf("\nOutput stout");
write(1, pO, strlen(pO));
printf("\nOutput fd 4");
write(pfds[1], pX, strlen(pX));

现在我有另一个程序“Operator”,它使用 execv 在子​​进程中执行上述程序(示例)。现在我想要的是通过“运算符(operator)”将输入发送到“样本”。

最佳答案

在 fork 子进程之后,但在调用 execve 之前,您必须调用 dup2(2) 来重定向子进程的 stdin 描述符到管道的读取端。这是一段没有太多错误检查的简单代码:

pipe(pfds_1); /* first pair of pipe descriptors */
pipe(pfds_2); /* second pair of pipe descriptors */

switch (fork()) {
case 0: /* child */
/* close write ends of both pipes */
close(pfds_1[1]);
close(pfds_2[1]);

/* redirect stdin to read end of first pipe, 4 to read end of second pipe */
dup2(pfds_1[0], 0);
dup2(pfds_2[0], 4);

/* the original read ends of the pipes are not needed anymore */
close(pfds_1[0]);
close(pfds_2[0]);

execve(...);
break;

case -1:
/* could not fork child */
break;

default: /* parent */
/* close read ends of both pipes */
close(pfds_1[0]);
close(pfds_2[0]);

/* write to first pipe (delivers to stdin in the child) */
write(pfds_1[1], ...);
/* write to second pipe (delivers to 4 in the child) */
write(pfds_2[1], ...);
break;
}

这样,您从父进程写入第一个管道的所有内容都将通过描述符 0 (stdin) 传递给子进程,而您从第二个管道也将被传送到描述符 4

关于c - 写入子进程文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5953386/

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