美文网首页
c++ 进程间通信

c++ 进程间通信

作者: 梵依然 | 来源:发表于2020-03-14 17:23 被阅读0次

    进程间通信

    各个函数的参数及使用请参考https://github.com/fanflame/cplusplus_ipc

    管道:

    无名管道

    特点

    底层用队列实现;
    管道中内容,读完就删除了;
    缺点:只能在父子进程或有亲缘关系的进程中使用

    使用:

    int  pipe(int [2]);//创建无名管道,参数返回写和读文件操作符
    

    读写使用read/write函数;
    close关闭文件操作符

    相关代码:

    pipe_unname.cpp

    有名管道

    特点

    在文件系统中存在文件节点:管道文件;
    该文件不占磁盘空间;
    可以实现无亲缘关系进程间通信;
    本质:内核中以队列形式存在的缓存;

    使用

    int mkfifo(const char *, mode_t);//创建管道对象
    int open(const char *, int, ...);//打开管道
    

    读写使用read/write函数;
    相关代码:
    pipe_name.cpp;
    pipe_name_antherprogress.cpp

    信号通信:

    特点

    使用内核中已经存在的信号对象;
    kill -l查看内核中支持多少种信号;
    需要接收进程存在;
    raise函数把信号发给当前进程;
    alarm函数:定时一段时间发出信号给当前进程,终止进程;
    接收信号的进程条件不能结束:;
    sleep;while(1);
    pause()与sleep状态一样;

    ipc对象:

    共享内存

    特点

    共享内存读完之后,内容还存在;

    使用
    key_t   ftok(const char *, int);//创建key
    int shmget(key_t, size_t, int);//创建共享内存对象
    void    *shmat (int, const void *, int);//内存映射
    int shmdt(const void *);//将用户空间的内存释放
    int shmctl(int, int, struct shmid_ds *)//将内核空间的内存释放
    

    消息队列

    特点

    链式队列;
    读完内容之后,消息就删除了;
    一个消息队列可以供两个进程双向通信

    使用
    int msgget(key_t, int);//创建消息队列对象
    int msgsnd(int, const void *, size_t, int)//发送消息
    ssize_t msgrcv(int, void *, size_t, long, int)//接收消息
    int msgctl(int, int, struct msqid_ds *)//删除、设置读取消息队列对象
    

    信号灯

    特点

    进程、线程间同步

    相关文章

      网友评论

          本文标题:c++ 进程间通信

          本文链接:https://www.haomeiwen.com/subject/drygshtx.html