04
2020
05

Linux命名管道总结

  管道是linux系统的一种进程间通信机制,它是一个只存在于内存的特殊文件,并且数据只能单向流动,而且只能用于具有亲缘关系的进程间(即父子进程,兄弟进程),无亲缘关系的进程是不能使用的。

  命名管道可以解决管道的局限性,即他可以使任意两个进程之间通信。命名管道是一个存在于硬盘上的文件。

  有两个函数可以创建命名管道:

  int mknod(const char *path,mode_t mod,dev_t dev);

  int mkfifo(const char *path,mode_t mode);

  命名管道和管道的使用方法相同,只是使用命名管道时必须使用open()函数将其打开。

值得注意的是:调用open()打开命名管道的进程可能会被阻塞,但如果同时用读写方式(O_RDWR)打开,则一定不会阻塞,如果以只读方式打开,则一定会阻塞直到有写的进程打开管道,同样以写的方式打开的时候也会被阻塞,直到有读的进程打开管道。

  创建一个命名管道:

bool CGlobe::createPipe(const char *pipename)

{

        struct stat buf;

    if(access(pipename,F_OK)== 0)//判断文件是否存在

    {

        if(lstat(pipename,&buf) == 0)//获取文件状态信息

        {

            if(S_ISFIFO(buf.st_mode))//判断是否是FIFO文件

                return true;

            else if(unlink(pipename)<0)//删除文件

                return false;

        }

        else 

            return false;

    }

    umask(0);

    if( mknod(pipename,S_IFIFO|0666,0)== -1 )//创建FIFO文件

            return false;

    return true;

}

命名管道是有名有形的,为了使用这种管道Linux中设立了一个专门的特殊文件系统--管道文件,它存在于文件系统中,任何进程可以在任何时候通过命名管道的路径和文件来访问管道,但是在磁盘上的只是一个节点,而文件的数据则只存在于内存缓冲页面中与普通管道一样。

原文链接:https://www.qiquanji.com/post/8369.html

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

gzh

微信扫码关注

更新实时通知

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。