zoukankan      html  css  js  c++  java
  • Linux IPC BSD Pipe

    mkfifo()

    //创建有名管道(FIFO special file),创建完了就像普通文件一样open(),再读写,成功返回0,失败返回-1设errno。VS$man 3 mkfifo
    #include <sys/types.h>
    #include <sys/stat.h>
    int mkfifo(const char *pathname, mode_t mode);
    

    pathname:the FIFO special file's name

    mode :the FIFO's permissions.

    //创建FIFO管道文件
    int res=mkfifo(“./a.fifo”,0664);
    if(-1==res)
    	perror("mkfifo"),exit(-1);
    res=open(“./a.fifo”,O_RDONLY);
    if(-1==res)
    	perror(“open”),exit(-1);
    

    pipe()

    //创建无名管道,相当于直接把open()返回的fd直接放到形参中,而不需额外的变量接收管道文件的描述符,用于父子进程间通过管道进行IPC通信,,成功返回0,失败返回-1设errno
    #include <unistd.h>
    int pipe(int pipefd[2]);    //代码自注释,表示它需要的参数是一个有两个元素的数组,如果虽然作为形参,实质上和int* pipefd没有区别
    

    pipefd :return two fds referring to the ends of the pipe.

    • pipefd[0] :read end,读端
    • pipefd[1] :write end,读端.

    fork()创建的child也会文件描述符总表也会复制一份So,对于child, 应该先关闭读端, 再写,对于parent,应该先关闭写端, 再读

    //使用pipe()实现父子进程的通信
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<stdlib.h>
    #include<stdio.h>
    int main(){
    	//1. 创建无名管道
    	int pipefd[2];
    	int res=pipe(pipefd);
    	if(-1==res)
    		perror("pipe"),exit(-1);
    	//2. 创建子进程
    	pid_t pid=fork();
    	if(-1==pid)
    		perror("fork"),exit(-1);
    
    	//3. 子进程开始启动,写入1~100;
    	if(0==pid){
    		close(pipefd[0]);
    		int i=0;
    		for(i=1;i<=100;i++){
    			write(pipefd[1],&i,sizeof(int));
    		}
    		close(pipefd[1]);//关闭写端
    		exit(0);
    	}
    	
    	//4. 父进程开始启动,读取管道中的数据
    	close(pipefd[1]);
    	int i=0;
    	for(i=1;i<=100;i++){
    		int x=0;
    		read(pipefd[0],&x,sizeof(int));
    		printf("%d ",x);
    	}
    	printf("
    ");
    	close(pipefd[0]);
    	return 0;
    }
    
  • 相关阅读:
    606. Construct String from Binary Tree
    696. Count Binary Substrings
    POJ 3255 Roadblocks (次短路)
    POJ 2823 Sliding Window (单调队列)
    POJ 1704 Georgia and Bob (博弈)
    UVa 1663 Purifying Machine (二分匹配)
    UVa 10801 Lift Hopping (Dijkstra)
    POJ 3281 Dining (网络流之最大流)
    UVa 11100 The Trip, 2007 (题意+贪心)
    UVaLive 4254 Processor (二分+优先队列)
  • 原文地址:https://www.cnblogs.com/xiaojiang1025/p/5935471.html
Copyright © 2011-2022 走看看