设为首页 收藏本站
查看: 793|回复: 0

[经验分享] linux中的命名管道(FIFO)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-7-21 08:45:21 | 显示全部楼层 |阅读模式
                      管道只能用于亲缘关系之间的通信,而FIFO中,只要可以访问路径,就可以进行通信。

FIFO按照先进先出的原则进行通信,第一个被写入的数据首先从管道中读出。

创建命名管道的系统函数有两个: mknod和mkfifo。两个函数均定义在头文件sys/stat.h,函数原型如下:
#include <sys/types.h>
#include <sys/stat.h>
int mknod(const char *path,mode_t mod,dev_t dev);
int mkfifo(const char *path,mode_t mode);

    函数mknod参数中path为创建的命名管道的全路径名: mod为创建的命名管道的模式,指明其存取权限; dev为设备值,该值取决于文件创建的种类,它只在创建设备文件时才会用到。这两个函数调用成功都返回0,失败都返回- 1。使用mknod函数创建了一个命名管道:

umask(0);
if (mknod("/tmp/fifo",S_IFIFO | 0666) == -1)
{
perror("mkfifo error");
exit(1);
}

函数mkfifo前两个参数的含义和mknod相同。

umask(0);
if (mkfifo("/tmp/fifo",S_IFIFO|0666) == -1)
{
perror("mkfifo error!");
exit(1);
}

“S_IFIFO|0666”指明创建一个命名管道且存取权限为0666,即创建者、与创建者同组的用户、其他用户对该命名管道的访问权限都是可读可写( 这需要注意umask对生成的管道文件权限的响)。

    调用open()打开命名管道的进程可能会被阻塞。但如果同时用读写方式( O_RDWR)打开,则一定不会导致阻塞;如果以只读方式( O_RDONLY)打开,则调用open()函数的进程将会被阻塞直到有写方打开管道;同样以写方式( O_WRONLY)打开也会阻塞直到有读方式打开管道。

    对文件系统来说,匿名管道是不可见的,它的作用仅限于在父进程和子进程两个进程间进行通信。而命名管道是一个可见的文件,因此,它可以用于任何两个进程之间的通信,不管这两个进程是不是父子进程,也不管这两个进程之间有没有关系。

fifo read端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#define _PATH_ "/tmp/file.tmp"
#define _SIZE_ 100
int main()
{
    int fd = open(_PATH_, O_RDONLY);
    if (fd < 0){
        printf("open file error!\n");
        return 1;
    }
    char buf[_SIZE_];
    memset(buf, '\0', sizeof(buf));
    while (1){
        int ret = read(fd, buf, sizeof(buf));
        if (ret <= 0)//error or end of file
        {
            printf("read end or error!\n");
            break;
        }
        printf("%s\n", buf);
        if (strncmp(buf, "quit", 4) == 0){
            break;
        }
    }
    close(fd);
    return 0;
}



fifo write端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#define _PATH_ "/tmp/file.tmp"
#define _SIZE_ 100
int main()
{
    int ret = mkfifo(_PATH_, 0666|S_IFIFO);
    if (ret == -1){
        printf("mkfifo error\n");
        return 1;
    }
    int fd = open(_PATH_, O_WRONLY);
    if (fd < 0){
        printf("open error\n");
    }
    char buf[_SIZE_];
    memset(buf, '\0', sizeof(buf));
    while (1){
        scanf("%s", buf);
        int ret = write(fd, buf, strlen(buf) + 1);
        if (ret < 0){
            printf("write error\n");
            break;
        }
        if (strncmp(buf, "quit", 4) == 0){
            break;
        }
    }
    close(fd);
    return 0;
}




                   


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-247122-1-1.html 上篇帖子: Linux磁盘管理 下篇帖子: vim中粘贴数据的时候如何取消自动缩进 linux 管道 命名
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表