正如我在评论中指出的,由于你将控制过程的标准产出改为管道的核销,因此,如果管理<代码>rev程序,则向管道提交。 它还从管道中读到,管道可以健康。
你还需要在等待完成之前启动儿童进程。
总的来说,你们都需要一大笔rew子。 我在此做的是:
/* SO 7839-3593 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include "stderr.h"
static void wait_loop(void)
{
int corpse;
int status;
while ((corpse = wait(&status)) > 0)
err_remark("child %5d died with status 0x%.4X
", corpse, status);
}
static void do_echo(int fd[2])
{
if (dup2(fd[1], STDOUT_FILENO) < 0)
err_syserr("dup2() failed to duplicate fd %d to fd %d: ", fd[1], STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
char *echo[] = { "echo", "Hello, World!", NULL };
err_remark("executing %s
", echo[0]);
execvp(echo[0], echo);
err_syserr("failed to execute %s: ", echo[0]);
/*NOTREACHED*/
}
static void do_rev(int fd[2])
{
if (dup2(fd[0], STDIN_FILENO) < 0)
err_syserr("dup2() failed to duplicate fd %d to fd %d: ", fd[0], STDIN_FILENO);
close(fd[0]);
close(fd[1]);
char *rev[] = { "rev", NULL };
err_remark("executing %s
", rev[0]);
execvp(rev[0], rev);
err_syserr("failed to execute %s: ", rev[0]);
/*NOTREACHED*/
}
int main(void)
{
err_setarg0("so-7839-3593");
err_setlogopts(ERR_PID|ERR_MILLI);
int pipefd[2];
// Create a pipe
if (pipe(pipefd) == -1)
err_syserr("pipe() failed: ");
pid_t pid = fork();
if (pid == -1)
err_syserr("fork() failed: ");
if (pid == 0)
do_echo(pipefd);
pid = fork();
if (pid == -1)
err_syserr("fork() failed: ");
if (pid == 0)
do_rev(pipefd);
close(pipefd[0]);
close(pipefd[1]);
wait_loop();
return 0;
}
This code uses my standard error reporting functions for succinctness.
The code for them is available in my SOQ (Stack Overflow Questions) repository on GitHub as files stderr.c
and stderr.h
in the src/libsoq sub-directory.
You could use the err(3)
on Linux instead.
<代码>main(>中的代码规定了方案名称和一些伐木选择(途径是书写项目设计书,时间为最接近的周期),然后才输入业务守则。 它创建管道,然后为第一个履行<条码>功能的儿童提供食宿。 然后,将第二名履行以下职能的儿童列入:do_rev()
。 然后,它关闭了管道的两端,进入了每名儿童在离开时报到的等候场所。
<代码>do_echo()功能由儿童过程执行。 它把管道的字末与标准产出(儿童向管道书写)相重复,然后关闭了“ 和>echo
。 如果execvp()
Return,该编码即告失败,err_syserr(
功能报告故障和退出。
<代码>do_rev()功能也由儿童程序执行。 它把管道的“末端”与标准投入(即儿童从管道读到)相重复,然后关闭了“ 和><>>> 管道的末端,并在发射失败时发射<> rev的指令、报告故障和撤离。
在我管理该方案的某个时候,我对从<代码>dup2()返回价值进行了 b测试,并得出了产出:
so-7839-3593: 2024-04-26 20:48:41.713 - pid=85728: dup2() failed to duplicate fd 4 to fd 1: error (22) Invalid argument
so-7839-3593: 2024-04-26 20:48:41.714 - pid=85729: executing rev
so-7839-3593: 2024-04-26 20:48:41.714 - pid=85727: child 85728 died with status 0x0100
so-7839-3593: 2024-04-26 20:48:41.717 - pid=85727: child 85729 died with status 0x0000
在我确定试验时,我得出以下产出:
so-7839-3593: 2024-04-26 20:51:48.298 - pid=85802: executing rev
so-7839-3593: 2024-04-26 20:51:48.298 - pid=85801: executing echo
!dlroW ,olleH
so-7839-3593: 2024-04-26 20:51:48.302 - pid=85800: child 85801 died with status 0x0000
so-7839-3593: 2024-04-26 20:51:48.302 - pid=85800: child 85802 died with status 0x0000
当你重新测试多加工管道时,确保你拥有与生产过程的公投数据库适当挂钩的cop缩产出。