您的位置:首页 > 运维架构 > Linux

linux 学习之管道

2012-07-06 15:11 148 查看
#include "apue.h"
#include <sys/wait.h>
#define DEF_PAGER "/bin/more"
int main (int argc, char *argv[])
{
int n;
int fd[2];
pid_t pid;
char *pager, *argv0;
char line[MAXLINE];
FILE *fp;
if (argc !=2)//命令行参数不为2时执行printf
{
printf("usage:a.out<pathmane>\n");
}
if ((fp = fopen(argv[1], "r")) == NULL)//以只读的方式打开文件,argv[1] 文件路径/文件名
{
printf("cann't open %d\n", argv[1]);//如果文件不存在,执行printf
}
if (pipe(fd) < 0)//建立管道
printf("pipe error\n");
if ((pid = fork()) < 0)//创建子进程
//调用fork()后,便有两个进程同时进行,一起执行 if ((pid = fork()) < 0)后的程序?
//fork()返回值有两个 在子进程中返回值为0
//在父进程中返回值为子进程ID
//用pid的值是0 还是子进程id 区分哪些代码段是有父进程执行,哪些由子进程执行
printf("fork error");
else if (pid > 0)//父进程
{
close (fd[0]);// 父进程中关闭读,父进程向管道中写
while (fgets (line, MAXLINE, fp) != NULL) //从fp指向的文件每次读MAXLINE个字符到line中
{
n = strlen(line); //不计算结尾的"/0"
if (write(fd[1], line, n) !=n)//将line中的n个字符写向管道
printf("write error to pipe");
}
if (ferror(fp))//如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错
printf("fgets error");
close (fd[1]);
if (waitpid(pid, NULL, 0) < 0)//等待子进程结束,正常结束返回子进程id
//waitpid函数中pid == -1 等待任意子进程,
//pid > 0 等待期进程id 与pid相等的子进程
//pid == 0 等待其进程组ID等于调用进程组ID的任意子进程
//pid < -1 等待其进程组ID等于pid绝对值的任一子进程
printf("waitpid error");
exit(0);
//write (fd[1], "hello world\n", 12);
}
else
{
close (fd[1]);//关闭写,子进程从管道中读
if (fd[0] != STDIN_FILENO)//标准输入
{
if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)
// dup2 复制文件描述符,用来重定向进程的stdin stdout stderr
printf("dup2 error to stdin");
close(fd[0]);//关闭读
}
if ((pager = getenv("PAGER")) == NULL)//从环境中取字符串,获取环境变量的值“PAGER巍蔽肪潮淞棵?
pager = DEF_PAGER;
if ((argv0 = strrchr(pager, '/')) != NULL)
//strrchr的作用是查找一个字符在某个字符串中最后一次出现的位置,并返回从字符串中的这个位置起一直到字符串结束的所有字符,如果未找到返回NULL
argv0++;
else
argv0 = pager;
if (execl(pager, argv0, (char *)0) < 0)
printf("execl error for %s\n", pager);
//n = read (f[0], line, MAXLINE);
//write (STDOUT_FILENO, line, n);
exit(0);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: