Chinaunix首页 | 论坛 | 博客
  • 博客访问: 441073
  • 博文数量: 88
  • 博客积分: 2677
  • 博客等级: 少校
  • 技术积分: 893
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-13 08:01
文章分类

全部博文(88)

文章存档

2017年(3)

2016年(1)

2012年(4)

2011年(4)

2010年(57)

2009年(19)

我的朋友

分类: LINUX

2009-09-17 10:18:31

下列程序是先生成PIPE后,再用Fork生成子进程。
子进程参照同一PIPE继承FD集合的Copy。
Fork之后,子进程关闭已没有必要的FD。
父进程向PIPE中写入包含参数的程序命令行,子进程从这个PIPE一个字节一个字节的读出文字列,并通过标准输出,发送响应echo。

以下のプログラムではパイプを生成し、その後 (2) で子プロセスを生成する。 子プロセスは同じパイプを参照するファイルディスクリプタ集合のコピーを 継承する。 (2) の後、各プロセスはパイプ ((7) を参照) に必要がなくなったディスクリプタをクローズする。 親プロセスはプログラムのコマンドライン引き数に含まれる 文字列をパイプへ書き込み、 子プロセスはこの文字列をパイプから 1 バイトずつ読み込んで標準出力にエコーする。
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>

int
main(int argc, char *argv[])
{
int pipefd[2];
pid_t cpid;
char buf;

assert(argc == 2); /* for debug
*/

if (pipe(pipefd) == -1) { /* 生成pipe */
perror("pipe");
exit(EXIT_FAILURE);
}

cpid = fork(); /* fork 生成子进程 */
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}

if (cpid == 0) { /* 子进程,从PIPE读取 */
close(pipefd[1]); /* 关闭 不被使用的子进程的Write端 */

while (read(pipefd[0], &buf, 1) > 0){
write(STDOUT_FILENO, &buf, 1); /* 从子进程的Read端,读取文字列 */
}

write(STDOUT_FILENO, "\n", 1); /* 文字列读取结束后,追加换行符 */
close(pipefd[0]); /* 读取写入后,关闭子进程pipe的Read端 */
_exit(EXIT_SUCCESS); /* 这个子进程立即终了,并向父进程发送SIGCHLD信号 */

} else { /* 父进程将argv[1]向PIPE中写入 */
close(pipefd[0]); /* 关闭 不被使用的父进程的Read端 */

write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* 写入后,父进程的Write端关闭 */

wait(NULL); /* 等待子进程的状态变化,
如:子进程终了;由于信号,子进程的停止;由于信号,子进程的再开 */
exit(EXIT_SUCCESS); /* 父进程正常终了 */
}
}
阅读(1914) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~