linux编程之管道

管道是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.命名管道

同样是半双工,允许无亲缘关系进程间的通信。
命名管道与文件操作非常统一,也使它的使用非常方便,同时我们也可以像平常的文件名一样在命令中使用。
使用方法为创建命名管道、打开命名管道、读/写命名管道、关闭管道

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



猜你喜欢

转载自blog.csdn.net/ajian0051/article/details/78995680
今日推荐