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

    一 无名管道:

    特点: 具有亲缘关系的进程间通信,但不只指父子进程之间哦。

    (1)无名管道的创建

    int pipe(int pipefd
    參数:
    pipefd  数组的首地址 
    返回值:
    成功返回0,失败返回-1 
    注意:
    无名管道存在内核空间。创建成功会给用户空间两个文件描写叙述符,fd[0]:读管道 fd[1]:写管道

    思考:为什么无名管道仅仅能用于亲缘关系间进程通信?
    由于仅仅有具有亲缘关系的进程存在数据拷贝 [复制文件描写叙述符]

    二。有名管道

    特点:
    (1)随意进程间通信 
    (2)文件系统中存在文件名称

    <1>创建有名管道文件 
    int mkfifo(const char *pathname, mode_t mode);
    參数:
    @pathname  文件名称 
    @mode      指定的权限 

    返回值:
    成功返回0,失败返回-1 

    <2>打开有名管道文件
    open 

    注意:
    一个进程以仅仅读方式打开管道文件。则堵塞,直到还有一个进程以写的方式打开管道文件 
    一个进程以仅仅写方式打开管道文件。则堵塞,直到还有一个进程以读的方式打开管道文件 

    <3>读写管道 
    read / write 


    以下加上一个管道之间通信的样例:

    负责从管道中读

    <pre name="code" class="cpp"> <pre name="code" class="cpp">#include <head.h>
    
    int read_fifo(int fd)
    {
    	int n;
    	char buf[1024];
    	
    	while(1)
    	{
    		n = read(fd,buf,sizeof(buf) - 1);
    		buf[n] = '';
    
    		printf("Read %d bytes : %s
    ",n,buf);
    
    		if(strncmp(buf,"quit",4) == 0)
    			break;
    	}
    
    	return 0;
    }
    
    //./a.out  fifoname
    int main(int argc, const char *argv[])
    {
    	int fd;
    
    	if(argc < 2)
    	{
    		fprintf(stderr,"Usage : %s argv[1]
    ",argv[0]);
    		exit(EXIT_FAILURE);
    	}
    
    	//创建有名管道 
    	if(mkfifo(argv[1],0666) < 0 && errno != EEXIST)
    	{
    		fprintf(stderr,"Fail to mkfifo %s : %s
    ",argv[1],strerror(errno));
    		exit(EXIT_FAILURE);
    	}
    
    	fd = open(argv[1],O_RDONLY);
    	if(fd < 0){
    		fprintf(stderr,"Fail to %s : %s
    ",argv[1],strerror(errno));
    		exit(EXIT_FAILURE);
    	}
    	
    	printf("Open success for read!
    ");
    	
    	read_fifo(fd);
    
    	return 0;
    }
    

    
    
    
    负责向管道中写
    

    #include <head.h>
    
    int write_fifo(int fd)
    {
    	char buf[1024];
    	
    	while(1)
    	{
    		printf("input >");
    		fgets(buf,sizeof(buf),stdin);
    		buf[strlen(buf) - 1] = '';
    
    		write(fd,buf,strlen(buf));
    		if(strncmp(buf,"quit",4) == 0)
    			break;
    	}
    	return 0;
    }
    
    //./a.out  fifoname
    int main(int argc, const char *argv[])
    {
    	int fd;
    
    	if(argc < 2)
    	{
    		fprintf(stderr,"Usage : %s argv[1]
    ",argv[0]);
    		exit(EXIT_FAILURE);
    	}
    
    	//创建有名管道 
    	if(mkfifo(argv[1],0666) < 0 && errno != EEXIST)
    	{
    		fprintf(stderr,"Fail to mkfifo %s : %s
    ",argv[1],strerror(errno));
    		exit(EXIT_FAILURE);
    	}
    
    	fd = open(argv[1],O_WRONLY);
    	if(fd < 0){
    		fprintf(stderr,"Fail to %s : %s
    ",argv[1],strerror(errno));
    		exit(EXIT_FAILURE);
    	}
    	write_fifo(fd);
    	
    	return 0;
    }
    


  • 相关阅读:
    git命令大全
    servlet执行顺序
    github使用教程
    upun使用教程
    jsp标签之<%%>和<%!%>
    spring MVC 详细入门
    jquery之ajax之$.get方法的使用
    jquery之getJSON方法获取中文数据乱码解决方法
    eclipse隐藏菜单栏实现全部酷黑主题
    eclipse快捷键失效的解决办法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5079934.html
Copyright © 2011-2022 走看看