IPC进程间通信

接上篇文章

Linux 7种 进程间通信方式-CSDN博客文章浏览阅读319次,点赞8次,收藏6次。通过文件实现进程间通信 必须人为保证先后顺序 A--->硬盘---> B(B不知道A什么时候把内容传到硬盘中)1.无名管道2.有名管道3.信号4.消息队列5.共享内存6.信号灯集原理:如果A和B进程想要通过无名管道通信,那就,A进程向管道的一端写数据,B进程可以从管道的另外一端读数据。在A进程和B进程进行数据传输的时候是的。无名管道是的通信方式。如果A进程一直向管道中写数据写满64K的时候A进程阻塞,直到B进程读一部分数据之后A才能继续写。https://blog.csdn.net/CSDN_DU666666/article/details/139904835?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22139904835%22%2C%22source%22%3A%22CSDN_DU666666%22%7D(内部进程通信Internal process communication 一般问指的是System V版本的以下三个)

 

        4.消息队列

        5.共享内存

        6.信号灯集合

 ipcs查看IPC进程间通信

ipcs -q     //查看消息队列

ipcs -m    //查看共享内存

ipcs -m    //查看信号灯集

ipcrm -q msqid //删除消息队列

ipcrm -m shmid //删除共享内存

ipcrm -s semid //删除信号灯集

 API

#include <sys/ipc.h>

key_t ftok(const char *pathname, int proj_id);
功能:获取IPC进程间通信的键值(两者只有键相同,才能找到是同一个消息队列 或共享内存或信号灯集) 
参数:
    @pathname:路径及名字
 @proj_id:id号只有低8bit有效  
返回值:成功返回key,失败返回-1置位错误码
      key(32bit) = inode(16)  devno(8)  proj_id(8)

实例

#include <head.h>

int main(int argc,const char * argv[])
{
    key_t key;
    struct stat st;
    if((key=ftok("/home/dgf",'k'))==-1){
        perror("ftok error");
        exit(-1);
    }
    printf("key = %#x\n",key);
    if(stat("/home/dgf",&st)){
        perror("stat error");
    }
    printf("ino = %#lx,st_dev = %#lx,proj_id = %#x\n",st.st_ino,st.st_dev,'k');
    return 0;
}

结果

 消息队列

API

(msgget|msgsnd|msgrcv|msgctl)

#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
功能:创建消息队列
参数:
    @key:键值
        key:通过ftok获取
        IPC_PRIVATE:只能用于亲缘间进程的通信
    @msgflag:消息队列的标志位
        IPC_CREAT|0666  或   IPC_CREAT|IPC_EXCL|0666  (PS:这里的0666就不会和umask取反相与了)
返回值:成功返回消息队列号,失败返回-1置位错误码

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
功能:向消息队列中发消息
参数:
    @msqid:消息队列号
    @msgp:消息的首地址
          struct ms
  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值