写一些随机数字到管道?

问题描述:

我的问题是我可以写一个整数管道?如何 ?写一些随机数字到管道?

我需要做3个处理第一个产生2号,第二让数字的总和,第三打印结果(采用PIPE)

感谢所有

+0

如果你想得到更多的答案,而不是“write(2)'”,那么我们需要更多关于你在做什么的更多细节。 – zwol 2010-12-14 16:49:27

+0

@Zack:看到编辑的问题PLZ – 2010-12-14 16:52:43

+0

闻起来像功课。 – 2010-12-14 16:55:21

您要做的事情的复杂部分是创建管道。你可以让壳为你做...

$ ./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的原因有关。
+0

这是回答作业问题的方法! – 2010-12-14 18:30:15

+0

waitpid需要3个参数(pid_t pid,int * status,int options),在这种情况下,第三个参数必须是0(阻止当前进程,直到子进程终止)。 – 2010-12-15 04:31:59

+0

路易斯:谢谢,纠正。 – zwol 2010-12-15 16:15:25

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

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