gpt4 book ai didi

c - 向管道写入一些随机数?

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

我的问题是我可以写一个整数到管道吗?以及如何?

我需要做 3 个过程,第一个生成 2 个数字,第二个对数字求和,第三个打印结果(使用管道)

谢谢大家

最佳答案

您尝试做的复杂部分是创建管道。你可以让 shell 为你做...

$ ./makenumbers | ./addnumbers | ./printresult

但这很无聊,是吗?而且您必须拥有三个可执行文件。因此,让我们看看这些垂直条在 C 级别的作用。

您使用 pipe 创建了一个管道系统调用。您使用 dup2 重新分配标准输入/输出.您使用 fork 创建新流程,然后您等待它们以 waitpid 终止.设置整个过程的程序看起来像这样:

int
main(void)
{
pid_t children[2];
int pipe1[2], pipe2[2];
int status;

pipe(pipe1);
pipe(pipe2);

children[0] = fork();
if (children[0] == 0)
{
/* in child 0 */
dup2(pipe1[1], 1);
generate_two_numbers_and_write_them_to_fd_1();
_exit(0);
}

children[1] = fork();
if (children[1] == 0)
{
/* in child 1 */
dup2(pipe1[0], 0);
dup2(pipe2[1], 1);
read_two_numbers_from_fd_0_add_them_and_write_result_to_fd_1();
_exit(0);
}

/* parent process still */
dup2(pipe2[0], 0);
read_a_number_from_fd_0_and_print_it();

waitpid(children[0], &status, 0);
waitpid(children[1], &status, 0);

return 0;
}

请注意:

  • 我省略了所有的错误处理,因为这会使程序的长度增加三倍。您的讲师希望您包括错误处理。
  • 同样,我没有检查 child 的退出状态;你的导师也希望你检查一下。
  • 不需要 dup2 调用;您可以将管道 fd 编号传递给子例程调用。但如果你是 exec - 在 child 中创建一个新的二进制文件,这是更典型的,你会需要它们。然后,您还必须担心确保所有编号为 3 和更高的文件描述符都已关闭。
  • 我使用 _exit 是有原因的而不是 exit .试着弄清楚它是什么。
  • 您需要使用 readwrite而不是在从子进程调用的子例程中调用 stdio.h。原因与我使用_exit的原因有关。

关于c - 向管道写入一些随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4441689/

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