写一些随机数到管道?

时间:2010-12-14 16:42:55

标签: c linux operating-system pipe

我的问题是我可以写一个整数到管道吗?怎么样?

我需要先制作3个流程,然后生成2个数字,第二个生成数字的总和,第三个打印结果(USING PIPE)

全部谢谢

2 个答案:

答案 0 :(得分:7)

您尝试做的复杂部分是创建管道。你可以让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;
}

请注意:

  • 我遗漏了所有错误处理,因为这会使程序的时间延长三倍。您的教师希望您包含错误处理。
  • 同样,我没有检查儿童的退出状况;你的导师也希望你检查一下。
  • 你不需要 dup2个电话;你可以将管道fd号传递给子程序调用。但如果你是exec - 孩子的新二进制文件,这是更典型的,你需要它们。然后,您还必须担心确保编号为3及更高的所有文件描述符都已关闭。
  • 我使用_exit代替exit是有原因的。试着弄明白它是什么。
  • 您需要在子进程调用的子例程中使用readwrite而不是stdio.h调用。原因与我使用_exit
  • 的原因有关

答案 1 :(得分:3)

由于管道只是一个文件,您可以使用fprintf()函数将随机数转换为文本并将其写入管道。例如:

FILE *pipe = popen("path/to/your/program", "w");
if (pipe != NULL) {
    fprintf(pipe, "%d\n", rand());
    pclose(pipe);
}