1.ipc linux
创始人
2024-05-24 10:03:42
0
  • 查看系统消息队列,共享内存、信号量的命令。
  • picrm -m “id” 删除共享内存
  • picrm -s “id” 删除信号量
  • picrm -m “id” 删除消息队列

1. 无名管道

  • 无名/有名管道都属于文件,存在于内存中,管道通信实则是在对文件进行读写操作 read write

  • 两者都具有管道特性,先进先出,追加写文件,从头读文件并清楚已读内容

  • 无名管道

    • 只能亲缘关系进程间使用
    • 读写端同时存在,半双工。
    • 根据管道特性,虽然可以读写同时存在,但是通常读写都是相对的
    • 为了避免自写自读的情况发生,我们只保留一组读写端进行单工通信
    • 数据读后小时,不可进行二次读取
    • 读写方一旦确定无法更改,因为调用close关闭文件描述符后就无法使用open打开会出错。
    • 读管道
      • 管道中有数据:read 返回实际读到的字节数
      • 管道中无数据
        • 管道写端被全部关闭:read返回0(好像读到文件结尾)
        • 写端没有被全部关闭:read阻塞等待数据到来
    • 写管道
      • 管道读端被全部关闭:进程异常终止(也可以使用捕捉SIGPIPE信号,使进程不终止)
      • 管道读端没有被全部关闭
        • 管道已满,write阻塞
        • 管道未满,write将数据写入,并返回实际写入的字节数
  • 有名管道

    • 无亲缘关系的管道间使用
    • 当打开一个FIFO时,产生下列影响:(通常默认阻塞)
      • 在一般情况中(没有说明非阻塞 O_NONBLOCK),读打开要阻塞到某个其他进程为写打开此FIFO。为写而打开一个FIFO要阻塞到某个其他进程为读而打开它
      • 若指定了O_NONBLOCK,为读打开,如果没有进程已经为写而打开此FIFO,则读打开立即返回。为写打开,如果没有进程已经为读而打开一个FIFO,那么将出错返回,其errno是ENXIO
    • O_RDONLY、O_WRONLY、O_RDWR均可用,所以可以同时往管道进行读写进行双工通信;
      根据管道特性,虽然可以读写同时存在,但是通常读写都是相对的,为了避免自写自读的情况发生,
      采用只读只写方式打开进行单工通信
    #include 
    #include 
    #include 
    #include int main()
    {int pid;int fd[2];char r_buf[128]={0};if((pipe(fd)) == -1){perror("pipe fail");exit(-1);}if((pid = fork()) == -1){perror("fork fail");exit(-1);}if(pic > 0){close(fd[0]);//关闭读端write(fd[1], "hello world",strlen("hello world"));close(fd[1]);}else if(pid == 0){close(fd[1]); //关闭写端read(fd[0], r_buf, 128);printf(fd[0], r_buf);close(fd[0]);}
    // gcc demo1.c    ./a.outreturn 0;
    }
    

2. 有名管道 FIFO

  • 可以使用无亲缘进程之间
  • FIFO是一种文件类型,mkfifo创建,可以使用open打开,可以使用文件I/0函数
  • 打开FIFO以下影响,默认阻塞
    • 在一般情况中(没有说明非阻塞 O_NONBLOCK),读打开要阻塞到某个其他进程为写打开此FIFO。为写而打开一个FIFO要阻塞到某个其他进程为读而打开它。
    • 若指定了O_NONBLOCK,为读打开,如果没有进程已经为写而打开此FIFO,则读打开立即返回。
      为写打开,如果没有进程已经为读而打开一个FIFO,那么将出错返回,其errno是ENXIO。
#include 
#include 
#include 
#include int main()
{int fd;int pid;int sum =3;char r_buf[128]={0};if(((mkfifo("file", 0600)) == -1) && (errono != EEXIT)){perror("mkfifo fail");exit(-1);}if((pid = fork()) == -1){perror("fork fail");exit(-1);}if(pid > 0){fd = open("file", O_WRONLY);while(sum){write(fd, "message from fifo", strlen("message from fifo"));sleep(1);//间隔1ssum--;}close(fd);}else if(pid == 0){fd = open("file", O_RDONLY);while(sum){read(fd, r_buf, 128));sleep(1);//间隔1ssum--;}close(fd);}
// gcc demo2.c    ./a.outreturn 0;
}

3. 消息队列

4. 共享内存

5. 信号

6. 信号量

7. socket

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...