zoukankan      html  css  js  c++  java
  • Linux进程间通信 --- 管道

    这篇文章我们将介绍Linux间进程通间信中的有名管道与无名管道。

    一.无名管道

    无名管道是一种特殊类型的文件,在内核中对应的资源即一段特殊内存空间,这段空间完全由操作系统管理和维护。可以使用read/write等函数进行读写操作,但不能使用lseek函数来修改当前的读写位置,因为管道需要满足FIFO的原则。

    读写无名管道:

    读写管道使用的系统调用就是read和write,两者都默认以阻塞方式读写管道,如果要修改这两个函数的行为,可以使用fcntl函数实现。

    读写特点:





    利用无名管道实现子进程发送数据,父进程接收数据:

    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    
    int main()
    {
    	int filedes[2];
    	char buf[10] = {0};
    
    	pipe(filedes);
    
    	printf("Please input your string: 
    ");
    
    	if(fork() == 0)
    	{
    		close(filedes[0]);
    
    		while(1){
    			fgets(buf, 10, stdin);
    			int ret = write(filedes[1], buf, strlen(buf));
    			if(ret < 0)
    				break;
    		}
    	}
    	else
    	{
    		close(filedes[1]);
    
    		while(1){
    			int ret = read(filedes[0], buf, sizeof(buf));
    			if(ret < 0)
    				break;
    			printf("The msg that you input is : %s
    ", buf);
    			printf("Please input your string: 
    ");
    			memset(buf, 0, sizeof(buf));
    		}
    	}
          return 0;
    }
    
    二.有名管道

    有名管道FIFO依赖于文件系统,是一个存在的特殊文件,因此,FIFO可以在同主机任意进程间实现通信。

    有名管道虽然和普通文件一样具有磁盘存放路径、文件权限和其他属性;但是,它和普通文件又有区别,有名管道并没有在磁盘中存放真正的信息,它存储的通信信息在内存中,两个进程结束后自动丢失,拥有的一个磁盘路径仅仅是一个接口,其目的是使用进程间信息的编程更简单统一。通信的两个进程结束后,它的文件路径本身仍然存在,这是和无名管道不一样的地方。

    读写有名管道:
    通过write和read来操作有名管道前,需要调用open()函数打开该文件,另外,操作有名管道的阻塞位置为open位置,而不是无名管道的读写位置。

    读写特点:

    单进程读写有名管道:

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    #define FIFO_MODE 00600
    #define FD_FLAG O_RDWR
    
    int main(int argc, char** argv)
    {
        char buf[] = "Lance#";
        char RecvBuf[20] = {0};
    
        unlink(argv[1]);
    
        mkfifo(argv[1], FIFO_MODE);
    
        int fd = open(argv[1], FD_FLAG);
    
        write(fd, buf, sizeof(buf));
    
        read(fd, RecvBuf, sizeof(buf));
    
        puts(RecvBuf);
    
        return 0;
    }
    
    

    执行结果:

    管道基本特点总结:

  • 相关阅读:
    加分二叉树
    逃离牧场
    [Apio2012]dispatching
    靶形数独
    POJ 1459-Power Network(网络流-最大流-ISAP)C++
    题解 最优的挤奶方案(Optimal Milking)
    [HNOI2007]紧急疏散EVACUATE (湖南2007年省选)
    【LCA求最近公共祖先+vector构图】Distance Queries
    BZOJ1143: [CTSC2008]祭祀river
    BZOJ2140: 稳定婚姻
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/8401424.html
Copyright © 2011-2022 走看看