• linux进程间通信--有名管道


    有名管道

    只有当一个库函数失败时,errno才会被设置。当函数成功运行时,errno的值不会被修改。这意味着我们不能通过测试errno的值来判断是否有错误存在。反之,只有当被调用的函数提示有错误发生时检查errno的值才有意义。
    查看错误代码errno是调试程序的一个重要方法。当linux C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。在实际编程中用这一招解决了不少原本看来莫名其妙的问题。
     
    有名管道比无名管道更强大,它可以让无关联的进程间进行通信。
    一个shell命令可以建立一个有名管道
    命令格式:
    mkfifo[option] name
    option选项
    mkfifo建立一个name的有名管道
     
    如:
    mkfifo fifo1   #建立一个fifo1的有名管道  --p代表管道文件
    cat <  fifo1 #通过cat命令对管道进行读数据
    ls  > fifo1 #ls命令显示写入管道
     
    删除rm
    删除有名管道函数:unlink();

    列子:

    读文件

    #include<sys/types.h>
    2 #include<sys/stat.h>
    3 #include<errno.h>
    4 #include<fcntl.h>
    5 #include<stdio.h>
    6 #include<string.h>
    7 #include<stdlib.h>

    9 #define FIFO "/tmp/myfifo"
    10 
    11 int main(int argc , char**argv)
    12 {
    13 char buf_r[100];
    14 int fd;
    15 int nread;
    16 if(( mkfifo(FIFO,O_CREAT|O_EXCL) < 0)&&(errno != EEXIST))
    17 {
    18 printf("can't create fifoserver ");
    19 }
    20 printf("preparing for reading bytes.. ");
    21 memset(buf_r, 0,sizeof(buf_r));
    22 fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
    23 if(fd == -1)
    24 {
    25 perror("open");
    26 exit(1);
    27 }

    28 while(1)
    29 {
    30 memset(buf_r, 0,sizeof(buf_r));
    31 if(nread=read(fd,buf_r ,100)== -1)
    32 {
    33 if(errno==EAGAIN)
    34 printf("no data ");
    35 
    36 }
    37 printf("read%sfrom FIFO ",buf_r);
    38 sleep(1);
    39 }
    40 pause();
    41 unlink(FIFO);
    42 }

    写文件

    1 #include<sys/types.h>
    2 #include<sys/stat.h>
    3 #include<errno.h>
    4 #include<fcntl.h>
    5 #include<stdio.h>
    6 #include<stdlib.h>
    7 #include<string.h>

    9 #define FIFO_SERVER "/tmp/myfifo"
    10 
    11 int main(int argc , char** argv)
    12 {
    13 int fd;
    14 char w_buf[100]={''};
    15 int nwrite;
    16 if( fd == -1 )
    17 {
    18 if(errno==ENXIO)
    19 printf("open error ");
    20 }
    21 fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);
    22 if(argc == 1)
    23 printf("please send something ");
    24 strcpy(w_buf,argv[1]);
    25 if( (nwrite = write(fd,w_buf,100) )== -1 )
    26 {
    27 if( errno == EAGAIN)

    28 printf("The FIFO has not been read yet ");
    29 }
    30 else
    31 printf("write %s to the FIFO ",w_buf);

  • 相关阅读:
    PHP-redis中文文档
    thinkphp5操作redis系列教程】列表类型之lRange,lGetRange
    微信小程序利用canvas生成海报分享图片
    layui 富文本 图片上传 后端PHP接口
    Redis 学习笔记(十二)Redis 复制功能详解 ----- (error) READONLY You can't write against a read only slave
    php 从2维数组组合为四维数组分析(项目中前台侧边栏导航三级分类显示)
    MySQL中的外键是什么、有什么作用
    微信小程序之自定义模态弹窗(带动画)实例
    【JZOJ4805】【NOIP2016提高A组模拟9.28】跟踪
    【JZOJ4804】【NOIP2016提高A组模拟9.28】成绩调研
  • 原文地址:https://www.cnblogs.com/yuankaituo/p/4343989.html
Copyright © 2020-2023  润新知