4、管道文件
来源:互联网 发布:淘宝上东西质量怎么样 编辑:程序博客网 时间:2024/06/05 18:11
4、管道文件
Linux 提供了许多的过滤和重定向程序,比如more cat
等等.还提供了< > | <<等等重定向操作符.在这些过滤和重 定向程序当中,都用到了管
道这种特殊的文件.系统调用pipe 可以创建一个管道.
#include<unistd.h>
19
int pipe(int fildes[2]);
pipe 调用可以创建一个管道(通信缓冲区).当调用成功时,我们可以访问文件描述符fild
es[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)
{
char buffer[BUFFER+1];
int fd[2];
if(argc!=2)
{
fprintf(stderr,"Usage:%s string\n\a",argv[0]);
exit(1);
}
if(pipe(fd)!=0)
{
fprintf(stderr,"Pipe Error:%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);
20
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;
char buffer[BUFFER_SIZE];
if(argc!=2)
{
fprintf(stderr,"Usage:%s outfilename\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,"Redirect Standard Out Error:%s\n\a",strerror(errno));
exit(1);
}
fprintf(stderr,"Now,please input string");
21
fprintf(stderr,"(To quit 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 提供了许多的过滤和重定向程序,比如more cat
等等.还提供了< > | <<等等重定向操作符.在这些过滤和重 定向程序当中,都用到了管
道这种特殊的文件.系统调用pipe 可以创建一个管道.
#include<unistd.h>
19
int pipe(int fildes[2]);
pipe 调用可以创建一个管道(通信缓冲区).当调用成功时,我们可以访问文件描述符fild
es[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)
{
char buffer[BUFFER+1];
int fd[2];
if(argc!=2)
{
fprintf(stderr,"Usage:%s string\n\a",argv[0]);
exit(1);
}
if(pipe(fd)!=0)
{
fprintf(stderr,"Pipe Error:%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);
20
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;
char buffer[BUFFER_SIZE];
if(argc!=2)
{
fprintf(stderr,"Usage:%s outfilename\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,"Redirect Standard Out Error:%s\n\a",strerror(errno));
exit(1);
}
fprintf(stderr,"Now,please input string");
21
fprintf(stderr,"(To quit 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 等等常用的文件操作
命令了.
想不想自己写几个试一试呢?
- 4、管道文件
- 管道文件初探
- Linux 管道文件
- Unix的管道文件
- 管道文件的操作
- 命名管道文件的使用
- 通过管道实现文件复制
- JNI通过管道传输文件
- Linux 管道、mmap文件映射
- 管道方式实现文件复制
- 管道文件和I/O文件
- 4 有名管道1
- 管道
- 管道
- 管道
- 管道
- 管道
- 管道
- java向MySQL插入当前时间
- Selenium用户指南 - 目录
- udev规则
- php mysqli 类中成员方法和属性
- Android APK反编译详解(附图)
- 4、管道文件
- Linux下C访问MySQL实践
- UIToolBar使用示例
- Selenium用户指南 - 第一章 Selenium 2.0 文档修订注解
- sizeof 操作符
- 浅学设计模式之组合<Composite>模式及在Android中的应用
- php 输出编码
- java ref 返回值,可获取ws或与其他语言交互时用
- stl删除操作