popen("ls~scottb","r"); popen("sort>/tmp/foo","w"); popen("sortuniqmore","w"); 下面的程序是另一个使用popen()的例子,它打开两个管道(一个用于ls命令,另一个用于 sort命令): #include<stdio.h> intmain(void) { FILE*pipein_fp,*pipeout_fp; charreadbuf[80]; /*Createonewaypipelinewithcalltopopen()*/ if((pipein_fp=popen("ls","r"))==NULL) { perror("popen"); exit(1); } /*Createonewaypipelinewithcalltopopen()*/ if((pipeout_fp=popen("sort","w"))==NULL) { perror("popen"); exit(1); } /*Processingloop*/ while(fgets(readbuf,80,pipein_fp)) fputs(readbuf,pipeout_fp); /*Closethepipes*/ pclose(pipein_fp); pclose(pipeout_fp); return(0); } 最后,我们再看一个使用popen()的例子。此程序用于创建一个命令和文件之间的管道: #include<stdio.h> intmain(intargc,char*argv[]) { FILE*pipe_fp,*infile; charreadbuf[80]; if(argc!=3){ fprintf(stderr,"USAGE:popen3[command][filename] "); exit(1); } /*Open up input file*/ if((infile=fopen(argv[2],"rt"))==NULL) { perror("fopen"); exit(1); } /*Create one way pipe line with call topopen()*/ if((pipe_fp=popen(argv[1],"w"))==NULL) { perror("popen"); exit(1); } /*Processingloop*/ do{ fgets(readbuf,80,infile); if(feof(infile))break; fputs(readbuf,pipe_fp); }while(!feof(infile)); fclose(infile); pclose(pipe_fp); return(0); } 下面是使用此程序的例子: popen3sortpopen3.c popen3catpopen3.c popen3morepopen3.c popen3catpopen3.cgrepmain
[目录]
--------------------------------------------------------------------------------
命名管道
命名管道和一般的管道基本相同,但也有一些显著的不同: *命名管道是在文件系统中作为一个特殊的设备文件而存在的。 *不同祖先的进程之间可以通过管道共享数据。 *当共享管道的进程执行完所有的I/O操作以后,命名管道将继续保存在文件系统中以便以后使用。
一个管道必须既有读取进程,也要有写入进程。如果一个进程试图写入到一个没有读取进程的管道中,那么系统内核将会产生SIGPIPE信号。当两个以上的进程同时使用管道时,这一点尤其重要。
[目录]
--------------------------------------------------------------------------------
创建FIFO
可以有几种方法创建一个命名管道。头两种方法可以使用shell。 mknodMYFIFOp mkfifoa=rwMYFIFO 上面的两个命名执行同样的操作,但其中有一点不同。命令mkfifo提供一个在创建之后直接改变FIFO文件存取权限的途径,而命令mknod需要调用命令chmod。 一个物理文件系统可以通过p指示器十分容易地分辨出一个FIFO文件。
$ls-lMYFIFO prw-r--r--1rootroot0Dec1422:15MYFIFO
请注意在文件名后面的管道符号“”。 我们可以使用系统调用mknod()来创建一个FIFO管道:
库函数:mknod(); 原型:intmknod(char*pathname,mode_tmode,dev_tdev); 返回值:如果成功,返回0 如果失败,返回-1:errno=EFAULT(无效路径名) EACCES(无存取权限) ENAMETOOLONG(路径名太长) ENOENT(无效路径名) ENOTDIR(无效路径名)
下面看一个使用C语言创建FIFO管道的例子:
mknod("/tmp/MYFIFO",S_IFIFO0666,0);
在这个例子中,文件/tmp/MYFIFO是要创建的FIFO文件。它的存取权限是0666。存取权限 也可以使用umask修改:
final_umask=requested_permissions&~original_umask
一个常用的使用系统调用umask()的方法就是临时地清除umask的值: umask(0); mknod("/tmp/MYFIFO",S_IFIFO0666,0);
另外,mknod()中的第三个参数只有在创建一个设备文件时才能用到。它包括设备文件的 主设备号和从设备号。 } }
[目录]
--------------------------------------------------------------------------------
操作FIFO
FIFO上的I/O操作和正常管道上的I/O操作基本一样,只有一个主要的不同。系统调用open用来在物理上打开一个管道。在半双工的管道中,这是不必要的。因为管道在系统内核中,而不是在一个物理的文件系统中。在我们的例子中,我们将像使用一个文件流一样使用管道,也就是使用fopen()打开管道,使用fclose()关闭它。
上一篇:如何实现大图标风格的打开对话框
下一篇:ar和nm命令的使用
|