白话Linux下C编程(三)文件入门(4):管道文件

白话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等等常用的文件操作命令了。

想不想自己写几个试一试呢?

最可怕的敌人,就是没有坚强的信念。

白话Linux下C编程(三)文件入门(4):管道文件

相关文章:

你感兴趣的文章:

标签云: