进程间通信

传统进程间通信方式
    无名管道 pipe
    有名管道 fifo
    信号 signal
system V IPC对象
    共享内存 share memory
    消息队列 message queue
    信号灯 semaphore
BSD
    套接字 socket

管道是基于文件描述符的通信方式。    
无名管道
    int pipe(int pipefd[2]);
    当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。
有名管道
    进程通过文件IO来操作有名管道

    int mkfifo(const char *filename,mode_t mode);


内存共享
    查看 system("ipcs -m");
    int shmget(key_t key, int size, int shmflg);
    void *shmat(int shmid, const void *shmaddr, int shmflg);
        struct shmid_ds
    int shmdt(const void *shmaddr);//撤销 共享内存映射
    int shmctl(int shmid,  int cmd,  struct shmid_ds *buf);

消息队列
    int msgget(key_t key, int flag);
    int msgsnd(int msqid, const void *msgp, size_t size, int flag);
        struct msgbuf
    int msgrcv(int msgid, void* msgp, size_t size, long msgtype, int flag);
    int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );

信号灯
    种类:
        posix有名信号灯
        posix基于内存的信号灯(无名信号灯)
        System V 信号灯(IPC对象)
        
    ystem V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯;而Posix信号灯指的是单个计数信号灯.
    System V 信号灯由内核维护
System V 信号灯
    int semget(key_t key, int nsems, int semflg);
    int semop (int semid, struct sembuf opsptr, size_t nops);
        struct sembuf;
    int semctl (int semid, int semnum, int cmd…/*union semun arg*/);
----------------------------------------------------------------------------------------------
进程间通讯方式比较
    pipe:  具有亲缘关系的进程间,单工,数据在内存中
    fifo:  可用于任意进程间,双工,有文件名,数据在内存
    signal:唯一的异步通信方式
    msg:  常用于cs模式中, 按消息类型访问 ,可有优先级
    shm:  效率最高(直接访问内存) ,需要同步、互斥机制
    sem:  配合共享内存使用,用以实现同步和互斥
----------------------------------------------------------------------------------------------
总结    
IPC
    消息传递:signal、PIPE、FIFO、message queue
    共享存储:share file、share memory
    同步机制:locked file、locked region、semaphore set
ITC
    消息传递:FIFO、message queue
    共享存储:share file、share memory、global variable、heap memory
    同步机制:locked file、locked region、semaphore set、
              thread semaphore、thread mutex、thread rwlock、
              thread condition variable

posted @ 2015-08-02 12:28  cloudren2020  阅读(88)  评论(0编辑  收藏  举报