UNIX 管道和过滤器 进程间通信--协进程
一个UNIX系统过滤器是一个从标准输入读并写到标准输出的程序。过滤器通常在外壳管道里线性连接。一个过滤器变为一个协进程UNIX 管道和过滤器,当同一个的程序产生过滤器的输入并读取过滤器的输出。 Korn外壳提供了协进程。Bourne、Bourne-again和C外壳都没有提供一种把进程作为协进程连接在一起的方法。一个协进程通常从一个外壳运行到后台,它的标准输入和标准输出使用一个管道被连接到另一个程序。尽管初始化一个协进程并连接它的输入输出到另一个程序所需的外壳语法相当绕,但是协进程在C程序里也有用。 popen给了我们一个写到另一个进程的标准输入或从它的标准输出读的单向管道,而使用协进程,我们有了到另一个进程的双向管道:一个向它的标准输入写,一个从它的标准输出读。我们想向它的标准输入写,让让操作数据,然后从它的标准输出读。 让我们在一个例子里看下协进程。进程创建两个管道:一个是协进程的标准输入,而另一个是协进程的标准输出。 下面的代码是一个简单的协进程,它从标准输入读取两个数,计算它们的和,并把和写到标准输出。(协进程通常做比我们这里演示的更有趣的工作。这个例子是公认地捏造的,以便我们可以学习连接进程所需的探索。) #include #define MAXLINE4096 int main(void) { intn, int1, int2; char line[MAXLINE]; while ((n = read(STDIN_FILENO, line, MAXLINE)) > 0) { line[n] = 0;/* null terminate */ if (sscanf(line, "%d%d", &int1, &int2) == 2) { sprintf(line, "%d\n", int1 + int2); n = strlen(line); if (write(STDOUT_FILENO, line, n) != n) { printf("write error\n"); exit(1); } } else { if (write(STDOUT_FILENO, "invalid args\n", 13) != 13) { printf("write error\n"); exit(1); } } } exit(0); } 我们把这个程序编译为可执行程序filter_add_two_numbers。 下面的代码调用上面的协进程,在从标准输入读两个数后。协进程的值被写到它的标准输出。 #include #include #include #define MAXLINE4096 static void sig_pipe(int); /* our signal handlers */ int main(void) { intn, fd1[2], fd2[2]; pid_t pid; char line[MAXLINE]; if (signal(SIGPIPE, sig_pipe) == SIG_ERR) { printf("signal error\n"); exit(1); } if (pipe(fd1) (编辑:源码网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |