进程间通信方式

进程间通信Inter-Process Communication,IPC
            1)匿名管道        
               int pipe(int fd[2]); 产生一个管道,两端各自用一个文件描述符表示,其中读端的文件描述符保存在fd[0]中,写端的文件描述符保存在fd[1]中。
               只能用于父子进程间通信。在两个进程中只保留个描述符,一个保留写,另一个保留读,反之亦然。
            2)命名管道named pipe (mkfifo)         
               int mkfifo(const char *pathname, mode_t mode);  //按指定的权限去创建管道文件
               打开是不应使用O_CREAT;
               打开操作会等待同时存在读写双方时才继续;
               可以用于任意进程间单向通信。
            3)匿名本地网络  
               socketpair(AF_LOCAL, SOCK_STREAN, 0, int fd[2]); //产生一对相互连接的网络套接字,可以用于两进程间相互通信
               用于fork的父子进程中通信,每个进程中只保留个套接字就好,读写都用它。
            4)专业的进程间通信方式:共享内存、消息队列、信号量
               共享内存:
                   int shmget(key_t key, size_t size, int shmflg);  //创建或获取一块共享内存对象,返回对象id,同一个可以返回同一个共享内存id, 当key是IPC_PRIVATE的时候例外,总是创建一片新的共享内存。shmflag可以是PIC_CREAT IPC_EXCL的适当组合。失败返回-1.key 类似于文件路径。 
                   void *shmat(int shmid, const void *shmaddr, int shmflg); //把共享内存对象挂接到本进程内存中,返回挂接后的地址,失败返回-1
                   int shmdt(const void *shmaddr);  //解除共享内存对象的挂接,shmaddr是shmat的返回值
                   int shmctl(int shmid, int cmd, struct shmid_ds *buf);  //对共享内存的操作
                       shmctl(id, IPC_RMID, NULL) //删除共享内存
                   ipcs 命令查看进程间通信对象状态,ipcrm删除进程间通信对象
                消息队列:
                    int msgget(key_t key, int msgflg);    //创建或取得消息队列对象,返回对象的id,同一个key返回相同id
                    int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);  //打包发送一个消息数据到队列中,返回发送的字节数
                    ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); //从消息队列中接收指定类型的消息,返回收到的字节数
                    int msgctl(int msqid, int cmd, struct msqid_ds *buf);  //对一个消息队列进行设置
                    消息队列里头的消息由类型和数据组成,发送和接收的时候指定的长度都是指的数据的长度(不包括类型占用的4字节)。
                信号量集
                    int semget(key_t key, int nsems, int semflg); //创建获取的一个信号量集对象,返回对象id,semflg 可以是0/IPC_CREAT/IPC_EXCL跟权限组合
                    int semop(int semid, struct sembuf *sops, size_t nsops);//对信号量集中sops指定的信号量操作                    
                       struct sembuf{
                        ......
                        unsigned short sem_num;  /* semaphore number */ 一般是0,表示第一信号量
                        short          sem_op;   /* semaphore operation */ 计数器操作,一般是1或-1,表示计算器加1或减1
                        short          sem_flg;  /* operation flags */ 0或IPC_NOWAIT或SEM_UNDO组合,其中SEM_UNDO表示进程结束时系统自动复原该信号量
                    };   
                    int semctl(int semid, int semnum, int cmd, ...); //IPC_RMID     
                         semctl(semid, 0, IPC_RMID, NULL) //删除信号量集
                         semctl(semid, idx, SETVAL, N) //设置编号为dix的信号量值为N
                    信号量就是一个计数器,一般用来控制访问同一资源的进程数量,控制多个进程的同步。计数器的减1操作在不够减时会等待直到够减为止(信号可能会打断它),semtimedop可以指定超时时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值