概述
管道是linux进程通信的一种方式,还包括信号量,消息队列,socket通信,共享内存等。本文着眼于管道。
管道,就好比水管的两端。数据从一端filedes[0]流入,从另一端filedes[1]流出。 这就需要用到两个进程来做测试,fork可以开辟一对父子进程,用于程序的测试。所以简单说下fork。代码均以最简方式展现。
1.fork
fork将使该程序同时开辟一个新的进程,官方的说法就是调用一个函数,有两个返回值。
根据返回的pid不同,去确定不同的进程执行的函数。
pid = fork();
if(pid == -1){
fprintf(stderr,"fork error");
exit(EXIT_FAILURE);
}
if(pid == 0){
//子进程,复制了父进程的堆栈,但是不是同一个空间
}else{
//父进程
}
2.匿名管道
匿名管道是半双工通信,仅适用于具有父子关系的亲密进程中。
int data_processed = 0; //数据传输个数
int filedes[2]; //管道的两端
char buffer[BUFSIZ + 1]; //缓冲区
if(pipe(filedes) == 0) //开辟管道,filedes[0] filedes[1]为管道的两端。
//从管道一段读取管道
data_processed = read(filedes[0], buffer, BUFSIZ);
//从管道一端写入数据
data_processed = write(filedes[1], data, strlen(data)); 、
3.命名管道
同样是半双工,允许无亲缘关系进程间的通信。
http://blog.csdn.net/ljianhui/article/details/10202699
命名管道与文件操作非常统一,也使它的使用非常方便,同时我们也可以像平常的文件名一样在命令中使用。
使用方法为创建命名管道、打开命名管道、读/写命名管道、关闭管道
int pipe_fd = -1; //管道id
const char *fifo_name = "/tmp/my_fifo"; //管道名称
int res = 0;
const int open_mode = O_WRONLY; //访问模式
pipe_fd = open(fifo_name, open_mode); //打开管道
if(access(fifo_name, F_OK) == -1)
{
//管道文件不存在
//创建命名管道
res = mkfifo(fifo_name, 0777);
if(res != 0) {...}
}
//以只写阻塞方式打开FIFO文件,以只读方式打开数据文件
pipe_fd = open(fifo_name, open_mode);
if(pipe_fd != -1)
{
//读取FIFO中的数据,并把它保存在文件DataFormFIFO.txt文件中
res = read(pipe_fd, buffer, PIPE_BUF);
//保存读取到的管道数据
}
参考文章:
匿名管道:http://blog.csdn.net/ljianhui/article/details/10168031
命名管道:http://blog.csdn.net/ljianhui/article/details/10202699
最后
以上就是喜悦外套为你收集整理的linux编程之管道的全部内容,希望文章能够帮你解决linux编程之管道所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复