• linux命名管道通信过程


    前一个道,这节学习命名管道。

    二命名管道
    无名管道仅仅能用来在父子进程或兄弟进程之间进行通信,这就给没有亲缘关系的进程之间数据的交换带来了麻烦。解决问题就是本节要学习的还有一种管道通信:命名管道。
    命名管道也被称为FIFO文件,FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程。仅仅要可以訪问该路径,就行彼此通过FIFO相互通信(可以訪问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是。FIFO严格遵循先进先出(first in first out)。对管道及FIFO的读总是从開始处返回数据,对它们的写则把数据加入到末尾。它们不支持诸如lseek()等文件定位操作。

    http://blog.csdn.net/xiaoliangsky/article/details/40121893

    1 mkfifo
    int mkfifo(const char *pathname, mode_t mode);
    mafifo函数创建一个FIFO,FIFO在文件系统中表现为一个文件。
    pahtname 文件路径
    mode 和系统调用open函数中的mode是一样的。

    返回值
    假设函数调用成功返回非-1。
    函数调用失败返回-1。

    2 命名管道操作
    FIFO在文件系统中表现为一个文件,大部分的系统文件调用都能够用在FIFO上面,比方:read。open,write。close。unlink。stat等函数。可是seek等函数不能对FIFO调用。

    2.1 打开命名管道
    能够调用open函数打开命名管道,可是有两点要注意
    1)不能以O_RDWR模式打开命名管道FIFO文件,否则其行为是没有定义的,管道是单向的。不能同一时候读写;
    2)就是传递给open调用的是FIFO的路径名,而不是正常的文件

    打开FIFO文件通常有四种方式:
    open(pathname, O_RDONLY);//1仅仅读、堵塞模式
    open(pathname, O_RDONLY | O_NONBLOCK);//2仅仅读、非堵塞模式
    open(pathname, O_WRONLY);//3仅仅写、堵塞模式
    open(pathname, O_WRONLY | O_NONBLOCK);//仅仅写、非堵塞模式

    注意堵塞模式open打开FIFO:
    1)当以堵塞、仅仅读模式打开FIFO文件时,将会堵塞,直到其它进程以写方式打开訪问文件;
    2)当以堵塞、仅仅写模式打开FIFO文件时。将会堵塞,直到其它进程以读方式打开文件;
    3)当以非堵塞方式(指定O_NONBLOCK)方式仅仅读打开FIFO的时候,则马上返回。当仅仅写open时,假设没有进程为读打开FIFO。则返回-1,其errno是ENXIO。


    以下是一个命名管道的样例:

    用命名管道实现多个进程间的通信,一个server进程负责接受多个cilent进程发来的消息

    server.c代码:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <limits.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    
    typedef struct 
    {
    	pid_t     child_pid;
    	char      message[PIPE_BUF+1];
    }fifo_message;
    
    int main()
    {
    	int                     fd;
    	const char             *fifoname;
    	fifo_message            msgbuf;
    
    	fifoname = "/tmp/serverfifo";
    
    	if (access(fifoname, F_OK) == -1)
    	{
    		if (mkfifo(fifoname, 0666) == -1)
    		{
    			perror("mkfifo error
    ");
    			exit(-1);
    		}
    	}
    
    	if ((fd = open(fifoname, O_RDONLY)) == -1)//以仅仅读、堵塞模式打开
    	{
    		fprintf(stdout, "open %s failed
    ", fifoname);
    		exit(-1);
    	}
    
    	while (1)
    	{
    		if (read(fd, &msgbuf, sizeof(msgbuf)) < 0)
    		{
    			close(fd);
    			perror("read error
    ");
    			exit(-1);
    		}
    
    		fprintf(stdout, "message from child: %d, message: %s
    ", msgbuf.child_pid, msgbuf.message);
    		sleep(1);
    	}
        
    	return 0;
    }

    client.c的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    
    struct fifo_message
    {
    	pid_t      child_pid;
    	char       message[PIPE_BUF+1];
    };
    
    
    int main()
    {
    	int                     fd;
    	const char             *fifoname;
    	struct fifo_message     msgbuf;
    
    	fifoname = "/tmp/serverfifo";
    	if (access(fifoname, F_OK) == -1)
    	{
    		perror("access error
    ");
    		exit(-1);
    	}
    
    	if ((fd = open(fifoname, O_WRONLY)) < 0)//以仅仅写、堵塞模式打开
    	{
    		perror("open error
    ");
    	}
    
    	msgbuf.child_pid = getpid();
    
    	while (1)
    	{
    		printf("input the message: ");
    		if (fgets(msgbuf.message, sizeof(msgbuf.message), stdin) == NULL)
    		{
    			perror("fgets error or end
    ");
    			break;
    		}
    
    		msgbuf.message[strlen(msgbuf.message)] = '';
    
    		if (write(fd, &msgbuf, sizeof(msgbuf)) == -1)
    		{
    			perror("write error
    ");
    			close(fd);
    			exit(-1);
    		}
    	}
    	
    	close(fd);
    
    	return 0;
    }

    执行结果:



  • 相关阅读:
    Motion Estimation ,运动估计
    BT源代码学习心得(十三):客户端源代码分析(对等客户的连接建立及其握手协议) 转自CSDN:gushenghua的专栏
    BT源代码学习心得(十一):客户端源代码分析(存储管理) 转自CSDN:gushenghua的专栏
    BT源代码学习心得(六):跟踪服务器(Tracker)的代码分析(初始化) 转自CSDN:gushenghua的专栏
    BT源代码学习心得(十二):客户端源代码分析(从开始到连接建立阶段)
    BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象)
    BT源代码学习心得(十):客户端源代码分析(相关对象一览) 转自CSDN:gushenghua的专栏
    BT源代码学习心得(十四):客户端源代码分析(对等客户连接中的阻塞管理) 转自CSDN:gushenghua的专栏
    BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) 转自CSDN:gushenghua的专栏
    BT源代码学习心得(四):种子文件的生成 转自CSDN:gushenghua的专栏
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4565887.html
Copyright © 2020-2023  润新知