写一些随机数字到管道?
您要做的事情的复杂部分是创建管道。你可以让壳为你做...
$ ./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;
}
请注意:
这是回答作业问题的方法! – 2010-12-14 18:30:15
waitpid需要3个参数(pid_t pid,int * status,int options),在这种情况下,第三个参数必须是0(阻止当前进程,直到子进程终止)。 – 2010-12-15 04:31:59
路易斯:谢谢,纠正。 – 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);
}
如果你想得到更多的答案,而不是“write(2)'”,那么我们需要更多关于你在做什么的更多细节。 – zwol 2010-12-14 16:49:27
@Zack:看到编辑的问题PLZ – 2010-12-14 16:52:43
闻起来像功课。 – 2010-12-14 16:55:21