白话Linux下C编程(三)文件入门(4):管道文件
Linux提供了许多的过滤和重定向程序,比如more、cat等等。还提供了< >; | <<等等重定向操作符。在这些过滤和重定向程序当中,都用到了管道这种特殊的文件。系统调用pipe可以创建一个管道。
#include<unistd.h>;
int pipe(int fildes[2]);
pipe调用可以创建一个管道(通信缓冲区)。当调用成功时,我们可以访问文件描述符fildes[0],fildes[1]。其中fildes[0]是用来读的文件描述符,而fildes[1]是用来写的文件描
述符。
在实际使用中我们是通过创建一个子进程,然后一个进程写,一个进程读来使用的。
#include <stdio.h>;
#include <stdlib.h>;
#include <unistd.h>;
#include <string.h>;
#include <errno.h>;
#include <sys/types.h>;
#include <sys/wait.h>;
#define BUFFER 255
int main(int argc,char **argv)
{
charbuffer[BUFFER+1];
int fd[2];
if(argc!=2)
{
fprintf(stderr,"Usage:%sstring/n/a",argv[0]);
exit(1);
}
if(pipe(fd)!=0)
{
fprintf(stderr,"PipeError:%s/n/a",strerror(errno));
exit(1);
}
if(fork()==0)
{
close(fd[0]);
printf("Child[%d]Write to pipe/n/a",getpid());
snprintf(buffer,BUFFER,"%s",argv[1]);
write(fd[1],buffer,strlen(buffer));
printf("Child[%d]Quit/n/a",getpid());
exit(0);
}
else
{
close(fd[1]);
printf("Parent[%d]Read from pipe/n/a",getpid());
memset(buffer,’/0′,BUFFER+1);
read(fd[0],buffer,BUFFER);
printf("Parent[%d]Read:%s/n",getpid(),buffer);
exit(1);
}
}
为了实现重定向操作,我们需要调用另外一个函数dup2.
#include <unistd.h>;
int dup2(int oldfd,int newfd);
dup2将用oldfd文件描述符来代替newfd文件描述符,同时关闭newfd文件描述符。也就是说,所有向newfd操作都转到oldfd上面。下面我们学习一个例子,这个例子将标准输出重定向到一个文件。
#include <unistd.h>;
#include <stdio.h>;
#include <errno.h>;
#include <fcntl.h>;
#include <string.h>;
#include <sys/types.h>;
#include <sys/stat.h>;
#define BUFFER_SIZE 1024
int main(int argc,char **argv)
{
int fd;
charbuffer[BUFFER_SIZE];
if(argc!=2)
{
fprintf(stderr,"Usage:%soutfilename/n/a",argv[0]);
exit(1);
}
if((fd=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR))==-1)
{
fprintf(stderr,"Open%s Error:%s/n/a",argv[1],strerror(errno));
exit(1);
}
if(dup2(fd,STDOUT_FILENO)==-1)
{
fprintf(stderr,"RedirectStandard Out Error:%s/n/a",strerror(errno));
exit(1);
}
fprintf(stderr,"Now,pleaseinput string");
fprintf(stderr,"(Toquit use CTRL+D)/n");
while(1)
{
fgets(buffer,BUFFER_SIZE,stdin);
if(feof(stdin))break;
write(STDOUT_FILENO,buffer,strlen(buffer));
}
exit(0);
}
好了,文件一章我们就暂时先讨论到这里,学习好了文件的操作我们其实已经可以写出一
些比较有用的程序了。我们可以编写一个实现例如dir,mkdir,cp,mv等等常用的文件操作命令了。
想不想自己写几个试一试呢?
最可怕的敌人,就是没有坚强的信念。