?
目錄
前言
一、system V IPC對(duì)象圖解
1.流程圖解:
?編輯
2.查看linux內(nèi)核中的ipc對(duì)象:
?二、消息隊(duì)列
1.消息隊(duì)列的原理
2.消息隊(duì)列相關(guān)的API
2.1 獲取或創(chuàng)建消息隊(duì)列(msgget)
?實(shí)例代碼如下:
2.2 發(fā)送消息到消息隊(duì)列中
?實(shí)例代碼如下:
2.3 從消息隊(duì)列中獲取消息 ?
實(shí)例代碼如下:?
?2.4 消息隊(duì)列相關(guān)的命令
?2.5 管理消息隊(duì)列
?實(shí)例代碼如下:
三、共享內(nèi)存
1.概念
2.原理圖解
3.相關(guān)的api函數(shù)
3.1 創(chuàng)建共享內(nèi)存對(duì)象
?實(shí)例代碼如下:
3.2 映射共享內(nèi)存 ?
?3.3 取消映射
?實(shí)例代碼reader.c如下:
?實(shí)例代碼writer.c如下:
實(shí)例代碼shm.h 如下:
?3.4 管理共享內(nèi)存
實(shí)例代碼如下:?
四、信號(hào)燈 (信號(hào)量)
1.概念
2.信號(hào)燈相關(guān)的api函數(shù)
2.1 創(chuàng)建或獲取信號(hào)燈對(duì)象
實(shí)例代碼如下:
2.2 實(shí)現(xiàn)P操作和V操作 ?
實(shí)例代碼如下:
2.3 管理信號(hào)燈 ?
實(shí)例代碼如下:?
總結(jié)
前言
System V IPC(Inter-Process Communication)對(duì)象是一種用于在不同進(jìn)程之間進(jìn)行通信的機(jī)制。它包括三種類型的對(duì)象:消息隊(duì)列(Message Queue)、信號(hào)量(Semaphore)和共享內(nèi)存(Shared Memory)。
一、system V IPC對(duì)象圖解
1.流程圖解:
2.查看linux內(nèi)核中的ipc對(duì)象:
?文章來源地址http://www.zghlxwxcb.cn/news/detail-716528.html
?二、消息隊(duì)列
1.消息隊(duì)列的原理
?文章來源:http://www.zghlxwxcb.cn/news/detail-716528.html
2.消息隊(duì)列相關(guān)的API
2.1 獲取或創(chuàng)建消息隊(duì)列(msgget)
頭文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>int msgget(key_t key, int msgflg);
//參數(shù)1 ?----- key :
?? ??? ??? ? ? 動(dòng)態(tài)獲取key: ?ftok()
? ? ? ? ? ? ? ? ? ? #include <sys/types.h>
? ? ? ? ? ? ? ? ? ? #include <sys/ipc.h>
? ? ? ? ? ? ? ? ? ? key_t ftok(const char *pathname, int proj_id);
? ? ? ? ? ? ? ? ? ? //參數(shù)1 ?---- 工程目錄
? ? ? ? ? ? ? ? ? ? //參數(shù)2 ?---- 工程編號(hào)
? ? ? ? ? ? ? ? ? ? //返回值 ----- 成功,返回key值,失?。?1
? ? ? ? ? ? ? ?靜態(tài)分配: IPC_PRIVATE
//參數(shù)2 ------ msgflg:如果消息隊(duì)列不存在,需要給出創(chuàng)建的關(guān)鍵字,并設(shè)置權(quán)限 IPC_CREAT | 0666
//返回值 ----- 成功:消息隊(duì)列的ID,失敗:-1?? ?
?實(shí)例代碼如下:
int main(void)
{
key_t key;
int msg_id;
//獲取key值
key = ftok("./",0xa);
if(key < 0){
perror("ftok");
exit(1);
}
//創(chuàng)建或獲取消息對(duì)象
msg_id = msgget(key,IPC_CREAT|0666);
if(msg_id < 0){
perror("msgget");
exit(1);
}
return 0;
}
2.2 發(fā)送消息到消息隊(duì)列中
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
//參數(shù)1 ----- 消息隊(duì)列的id
//參數(shù)2 ----- ?指向struct msgbuf結(jié)構(gòu)體的指針,該結(jié)構(gòu)體需要自己定義,如下:
? ? ? ? ? ? ?? ?struct msgbuf {
? ? ? ? ? ? ? ? ? ?long mtype; ? ? ? /* message type, must be > 0 消息類型*/
? ? ? ? ? ? ? ? ? ?char mtext[1]; ? ?/* message data ?消息正文*/
? ? ? ? ? ? ? ? };
//參數(shù)3 ---- 要發(fā)送的消息的長(zhǎng)度?
//參數(shù)4 ---- msgflg值如下:
?? ??? ??? ?IPC_NOWAIT ?消息沒有發(fā)送完成函數(shù)也會(huì)立即返回。
?? ??? ??? ?0:直到發(fā)送完成函數(shù)才返回
//返回值 --- 成功:0,失?。?1
?實(shí)例代碼如下:
int main(void)
{
key_t key;
int msg_id;
//獲取key值
key = ftok("./",0xa);
if(key < 0){
perror("ftok");
exit(1);
}
//創(chuàng)建或獲取消息對(duì)象
msg_id = msgget(key,IPC_CREAT|0666);
if(msg_id < 0){
perror("msgget");
exit(1);
}
//向消息隊(duì)列中發(fā)送消息
while(1){
bzero(&buf,sizeof(buf));
printf("請(qǐng)輸入消息的類型:");
scanf("%ld",&buf.mtype);
printf("請(qǐng)輸入消息:");
while(getchar() != '\n'); //清空輸入緩沖區(qū)
fgets(buf.mtext,sizeof(buf.mtext),stdin);
buf.mtext[strlen(buf.mtext)-1] = '\0';
if(msgsnd(msg_id,&buf,strlen(buf.mtext),0) < 0){
perror("msgsnd");
exit(1);
}
}
return 0;
}
2.3 從消息隊(duì)列中獲取消息 ?
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
//參數(shù)1 ----- 消息隊(duì)列的id
//參數(shù)2 ----- ?指向struct msgbuf結(jié)構(gòu)體的指針,該結(jié)構(gòu)體需要自己定義,如下:
? ? ? ? ? ? ?? ?struct msgbuf {
? ? ? ? ? ? ? ? ? ?long mtype; ? ? ? /* message type, must be > 0 消息類型*/
? ? ? ? ? ? ? ? ? ?char mtext[1]; ? ?/* message data ?消息正文*/
? ? ? ? ? ? ? ? };
//參數(shù)3 ---- ?mtext的長(zhǎng)度
//參數(shù)4 ---- ?msgtyp:要接收的消息類型
?? ??? ??? ? msgtyp > 0 ,表示接收指定類型的消息?
? ? ? ? ? ? ?msgtyp = 0 ,按先后順序依次接收不同類型消息
? ? ? ? ? ? ?msgtyp < 0 ,優(yōu)先接收消息類型不大于|msgtyp|的最小類型的消息
//參數(shù)5 ---- msgflg值如下:
?? ??? ??? ?IPC_NOWAIT ?消息沒有發(fā)送完成函數(shù)也會(huì)立即返回。
?? ??? ??? ?0:直到發(fā)送完成函數(shù)才返回
//返回值 --- 成功:0,失?。?1
實(shí)例代碼如下:?
int main(void)
{
key_t key;
int msg_id;
//獲取key值
key = ftok("./",0xa);
if(key < 0){
perror("ftok");
exit(1);
}
//創(chuàng)建或獲取消息對(duì)象
msg_id = msgget(key,IPC_CREAT|0666);
if(msg_id < 0){
perror("msgget");
exit(1);
}
//從消息隊(duì)列中獲取消息
while(1){
bzero(&buf,sizeof(buf));
printf("請(qǐng)輸入消息的類型:");
scanf("%ld",&buf.mtype);
if(msgrcv(msg_id,&buf,sizeof(buf.mtext),buf.mtype,0) < 0){
perror("msgsnd");
exit(1);
}
printf("msg:%s\n",buf.mtext);
}
return 0;
}
?2.4 消息隊(duì)列相關(guān)的命令
peter@ubuntu:~/2308/proc/day04_code$ ipcs -q
------ Message Queues --------
key ? ? ? ?msqid ? ? ?owner ? ? ?perms ? ? ?used-bytes ? messages
0x0a010356 0 ? ? ? ? ?peter ? ? ?666 ? ? ? ?61 ? ? ? ? ? 5peter@ubuntu:~/2308/proc/day04_code$ ipcrm -q 0
peter@ubuntu:~/2308/proc/day04_code$ ipcs -q------ Message Queues --------
key ? ? ? ?msqid ? ? ?owner ? ? ?perms ? ? ?used-bytes ? messages
?2.5 管理消息隊(duì)列
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
?//參數(shù)1 ---- 消息隊(duì)列ID
?//參數(shù)2 ---- 功能碼:
??? ??? ??? ??? ?IPC_STAT:讀取消息隊(duì)列的屬性,并將其保存在buf指向的緩沖區(qū)中。
? ? ? ? ? ? ? ? IPC_SET:設(shè)置消息隊(duì)列的屬性。這個(gè)值取自buf參數(shù)。
? ? ? ? ? ? ? ? IPC_RMID:從系統(tǒng)中刪除消息隊(duì)列。?? ?
?//參數(shù)3 ----struct msqid_ds 結(jié)構(gòu)體指針
??? ??? ??? ??? ?struct msqid_ds {
? ? ? ? ? ? ? ? ? ? ? ?struct ipc_perm msg_perm; ? ? /* Ownership and permissions */
? ? ? ? ? ? ? ? ? ? ? ?time_t ? ? ? ? ?msg_stime; ? ?/* Time of last msgsnd(2) */
? ? ? ? ? ? ? ? ? ? ? ?time_t ? ? ? ? ?msg_rtime; ? ?/* Time of last msgrcv(2) */
? ? ? ? ? ? ? ? ? ? ? ?time_t ? ? ? ? ?msg_ctime; ? ?/* Time of last change */
? ? ? ? ? ? ? ? ? ? ? ?unsigned long ? __msg_cbytes; /* Current number of bytes in
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? queue (nonstandard) */
? ? ? ? ? ? ? ? ? ? ? ?msgqnum_t ? ? ? msg_qnum; ? ? /* Current number of messages
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? in queue */
? ? ? ? ? ? ? ? ? ? ? ?msglen_t ? ? ? ?msg_qbytes; ? /* Maximum number of bytes
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? allowed in queue */
? ? ? ? ? ? ? ? ? ? ? ?pid_t ? ? ? ? ? msg_lspid; ? ?/* PID of last msgsnd(2) */
? ? ? ? ? ? ? ? ? ? ? ?pid_t ? ? ? ? ? msg_lrpid; ? ?/* PID of last msgrcv(2) */
? ? ? ? ? ? ? ? ? ?};
?實(shí)例代碼如下:
int main(int argc,char **argv)
{
int msg_id;
msg_id = atoi(argv[1]);
if(msgctl(msg_id,IPC_RMID,NULL) < 0){
perror("msgget");
exit(1);
}
return 0;
}
三、共享內(nèi)存
1.概念
共享內(nèi)存是一種最為高效的進(jìn)程間通信方式,進(jìn)程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝
為了在多個(gè)進(jìn)程間交換信息,內(nèi)核專門留出了一塊內(nèi)存區(qū),可以由需要訪問的進(jìn)程將其映射到自己的私有地址空間
進(jìn)程就可以直接讀寫這一內(nèi)存區(qū)而不需要進(jìn)行數(shù)據(jù)的拷貝,從而大大提高的效率。
由于多個(gè)進(jìn)程共享一段內(nèi)存,因此也需要依靠某種同步機(jī)制,如互斥鎖和信號(hào)量等?
2.原理圖解
?
?
3.相關(guān)的api函數(shù)
3.1 創(chuàng)建共享內(nèi)存對(duì)象
頭文件:
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
//參數(shù)1 ---- 動(dòng)態(tài)獲取key: ?ftok()
? ? ? ? ? ? ? ? ? ? #include <sys/types.h>
? ? ? ? ? ? ? ? ? ? #include <sys/ipc.h>
? ? ? ? ? ? ? ? ? ? key_t ftok(const char *pathname, int proj_id);
? ? ? ? ? ? ? ? ? ? //參數(shù)1 ?---- 工程目錄
? ? ? ? ? ? ? ? ? ? //參數(shù)2 ?---- 工程編號(hào)
? ? ? ? ? ? ? ? ? ? //返回值 ----- 成功,返回key值,失?。?1
? ? ? ? ? ? ? ?靜態(tài)分配: IPC_PRIVATE
//參數(shù)2 ---- 要?jiǎng)?chuàng)建或獲取的共享內(nèi)存的大小
//參數(shù)3 ---- 權(quán)限:IPC_CREAT | 0666
//返回值 ---- 成功:共享內(nèi)存ID,失敗:-1
?實(shí)例代碼如下:
int main(void)
{
key_t key;
int shm_id;
//獲取key值
key = ftok("./",0xa);
if(key < 0){
perror("ftok");
exit(1);
}
//創(chuàng)建或獲取共享內(nèi)存對(duì)象
shm_id = shmget(key,SHM_SIZE, IPC_CREAT|0666);
if(shm_id < 0){
perror("shmget");
exit(1);
}
return 0;
}
3.2 映射共享內(nèi)存 ?
void *shmat(int shmid, const void *shmaddr, int shmflg);
//參數(shù)1 ---- 共享內(nèi)存ID
//參數(shù)2 ---- 指定進(jìn)程虛擬空間的映射的起始地址,一般為NULL:讓系統(tǒng)分配一個(gè)起始地址
//參數(shù)3 ---- 訪問權(quán)限:SHM_RDONLY:共享內(nèi)存只讀
?? ??? ??? ??? ??? ?默認(rèn)0:共享內(nèi)存可讀寫
//返回值 --- 成功:映射的虛擬空間地址,失?。?1
?3.3 取消映射
int shmdt(const void *shmaddr);
//參數(shù) ----映射的虛擬空間的起始地址
//返回值 ----成功:0,失敗:-1
?實(shí)例代碼reader.c如下:
#include "shm.h"
int main(void)
{
key_t key;
int shm_id;
char *buf;
//獲取key值
key = ftok("./",0xa);
if(key < 0){
perror("ftok");
exit(1);
}
//創(chuàng)建或獲取共享內(nèi)存對(duì)象
shm_id = shmget(key,SHM_SIZE, IPC_CREAT|0666);
if(shm_id < 0){
perror("shmget");
exit(1);
}
//將共享內(nèi)存映射到進(jìn)程的虛擬空間中
buf = (char*)shmat(shm_id,NULL,0);
if(buf < 0){
perror("shmat");
exit(1);
}
//打印共享內(nèi)存中的數(shù)據(jù)
while(1){
printf("%s",buf);
sleep(1);
}
//解除映射
if(shmdt(buf) < 0){
perror("shmdt");
exit(1);
}
return 0;
}
?實(shí)例代碼writer.c如下:
#include "shm.h"
int main(void)
{
key_t key;
int shm_id;
char *buf;
//獲取key值
key = ftok("./",0xa);
if(key < 0){
perror("ftok");
exit(1);
}
//創(chuàng)建或獲取共享內(nèi)存對(duì)象
shm_id = shmget(key,SHM_SIZE, IPC_CREAT|0666);
if(shm_id < 0){
perror("shmget");
exit(1);
}
//將共享內(nèi)存映射到進(jìn)程的虛擬空間中
buf = (char*)shmat(shm_id,NULL,0);
if(buf < 0){
perror("shmat");
exit(1);
}
//向共享內(nèi)存寫數(shù)據(jù)
while(1){
printf("請(qǐng)輸入字符串:");
fgets(buf,SHM_SIZE,stdin);
}
//解除映射
if(shmdt(buf) < 0){
perror("shmdt");
exit(1);
}
return 0;
}
實(shí)例代碼shm.h 如下:
#ifndef __SHM_H__
#define __SHM_H__
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
#endif
?3.4 管理共享內(nèi)存
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
//參數(shù)1 ---- 共享內(nèi)存的ID
//參數(shù)2 ---- 功能碼:
? ? ? ? ? ? IPC_STAT ?(獲取對(duì)象屬性)
? ? ? ? ? ? IPC_SET (設(shè)置對(duì)象屬性)
? ? ? ? ? ? IPC_RMID (刪除對(duì)象)?? ?
//參數(shù)3 ----struct shmid_ds 結(jié)構(gòu)體指針
?? ??? ??? ?struct shmid_ds {
? ? ? ? ? ? ? ?struct ipc_perm shm_perm; ? ?/* Ownership and permissions */
? ? ? ? ? ? ? ?size_t ? ? ? ? ?shm_segsz; ? /* Size of segment (bytes) */
? ? ? ? ? ? ? ?time_t ? ? ? ? ?shm_atime; ? /* Last attach time */
? ? ? ? ? ? ? ?time_t ? ? ? ? ?shm_dtime; ? /* Last detach time */
? ? ? ? ? ? ? ?time_t ? ? ? ? ?shm_ctime; ? /* Last change time */
? ? ? ? ? ? ? ?pid_t ? ? ? ? ? shm_cpid; ? ?/* PID of creator */
? ? ? ? ? ? ? ?pid_t ? ? ? ? ? shm_lpid; ? ?/* PID of last shmat(2)/shmdt(2) */
? ? ? ? ? ? ? ?shmatt_t ? ? ? ?shm_nattch; ?/* No. of current attaches */
? ? ? ? ? ? ? ?...
? ? ? ? ? ?};
實(shí)例代碼如下:?
int main(int argc,char **argv)
{
int shm_id;
shm_id = atoi(argv[1]);
if(shmctl(shm_id,IPC_RMID,NULL) < 0){
perror("shmget");
exit(1);
}
return 0;
}
四、信號(hào)燈 (信號(hào)量)
1.概念
信號(hào)燈(semaphore),也叫信號(hào)量。它是不同進(jìn)程間或一個(gè)給定進(jìn)程內(nèi)部不同線程間同步的機(jī)制。
信號(hào)燈種類:
? ? posix有名信號(hào)燈
? ? posix基于內(nèi)存的信號(hào)燈(無名信號(hào)燈)
? ? System V信號(hào)燈(IPC對(duì)象)1》 二值信號(hào)燈:用于表示資源是否可用
?? ?值為0或1。與互斥鎖類似,資源可用時(shí)值為1,不可用時(shí)值為0。2》 計(jì)數(shù)信號(hào)燈:用于表示資源的數(shù)量
?? ?值在0到n之間。用來統(tǒng)計(jì)資源,其值代表可用資源數(shù)3》 等待操作,也稱為P操作
? ? 是等待信號(hào)燈的值變?yōu)榇笥?,然后將其減1;
4》 釋放操作,也稱為V操作
? ? ?用來喚醒等待資源的進(jìn)程或者線程5》System V的信號(hào)燈是一個(gè)或者多個(gè)信號(hào)燈的一個(gè)集合。其中的每一個(gè)都是單獨(dú)的計(jì)數(shù)信號(hào)燈。而Posix信號(hào)燈指的是單個(gè)計(jì)數(shù)信號(hào)燈
?
2.信號(hào)燈相關(guān)的api函數(shù)
2.1 創(chuàng)建或獲取信號(hào)燈對(duì)象
頭文件:
?#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
//參數(shù)1 ---- 動(dòng)態(tài)獲取key: ?ftok()
? ? ? ? ? ? ? ? ? ? #include <sys/types.h>
? ? ? ? ? ? ? ? ? ? #include <sys/ipc.h>
? ? ? ? ? ? ? ? ? ? key_t ftok(const char *pathname, int proj_id);
? ? ? ? ? ? ? ? ? ? //參數(shù)1 ?---- 工程目錄
? ? ? ? ? ? ? ? ? ? //參數(shù)2 ?---- 工程編號(hào)
? ? ? ? ? ? ? ? ? ? //返回值 ----- 成功,返回key值,失?。?1
? ? ? ? ? ? ? ?靜態(tài)分配: IPC_PRIVATE
//參數(shù)2 ---- 集合中信號(hào)燈的個(gè)數(shù)
//參數(shù)3 ---- 訪問權(quán)限:IPC_CREAT | 0666
//返回值 ---- 成功:信號(hào)燈對(duì)象ID,失敗:-1
實(shí)例代碼如下:
int main(void)
{
key_t key;
int sem_id;
//獲取key值
key = ftok("./",0xa);
if(key < 0){
perror("ftok");
exit(1);
}
//創(chuàng)建或獲取共享內(nèi)存對(duì)象
sem_id = semget(key,1, IPC_CREAT|0666);
if(sem_id < 0){
perror("semget");
exit(1);
}
return 0;
}
2.2 實(shí)現(xiàn)P操作和V操作 ?
int semop(int semid, struct sembuf *sops, size_t nsops);
//參數(shù)1 ----- 信號(hào)燈對(duì)象的ID
//參數(shù)2 ----- 結(jié)構(gòu)體指針
?? ??? ??? ??? ?struct sembuf {
? ? ? ? ? ? ? ? ? ?short ?sem_num; ?// ?要操作的信號(hào)燈的編號(hào)
? ? ? ? ? ? ? ? ? ?short ?sem_op; ? // ? ?0 : ?等待,直到信號(hào)燈的值變成0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// ? 1 ?: ?釋放資源,V操作
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// ? -1 : ?分配資源,P操作 ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ?short ?sem_flg; // 0, ?IPC_NOWAIT, ?SEM_UNDO
? ? ? ? ? ? ? ? };//參數(shù)3 -----nops: ?要操作的信號(hào)燈的個(gè)數(shù)
//返回值 ---- 成功:0,失?。?1
實(shí)例代碼如下:
//1》實(shí)現(xiàn)P操作
void sem_p(int sem_id,int index)
{
struct sembuf buf = {index,-1,0};
if(semop(sem_id,&buf,1) < 0){
perror("semop");
exit(1);
}
}
//2》實(shí)現(xiàn)v操作
void sem_v(int sem_id,int index)
{
struct sembuf buf = {index,1,0};
if(semop(sem_id,&buf,1) < 0){
perror("semop");
exit(1);
}
}
2.3 管理信號(hào)燈 ?
int semctl(int semid, int semnum, int cmd, ...);
//參數(shù)1 ---- 信號(hào)燈對(duì)象ID
//參數(shù)2 ---- 集合中信號(hào)燈的編號(hào)
//參數(shù)3 ---- 功能碼:
?? ??? ??? ?IPC_STAT ?----獲取信號(hào)燈對(duì)象屬性
?? ??? ??? ?IPC_SET ? ----設(shè)置信號(hào)燈對(duì)象屬性
?? ??? ??? ?IPC_RMID ?----從內(nèi)核中刪除信號(hào)燈對(duì)象
?? ??? ??? ?SETALL?? ? ?----設(shè)置集合中所有信號(hào)燈的值
?? ??? ??? ?SETVAL ? ?----設(shè)置集合中編號(hào)為semnum的信號(hào)燈的值
//參數(shù)4 ---- 聯(lián)合體變量,類型如下:
?? ??? ??? ?union semun {
? ? ? ? ? ? ? ?int ? ? ? ? ? ? ?val; ? ?/* Value for SETVAL */
? ? ? ? ? ? ? ?struct semid_ds *buf; ? ?/* Buffer for IPC_STAT, IPC_SET */
? ? ? ? ? ? ? ?unsigned short ?*array; ?/* Array for GETALL, SETALL */
? ? ? ? ? ? ? ?struct seminfo ?*__buf; ?/* Buffer for IPC_INFO
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(Linux-specific) */
? ? ? ? ? ?};
//返回值 -----成功:0,失?。?1
實(shí)例代碼如下:?
//初始化指定的信號(hào)燈
void sem_init(int sem_id,int semnum,int value)
{
union semun su;
su.val = value;
if(semctl(sem_id,semnum,SETVAL,su) < 0){
perror("semctl");
exit(1);
}
}
//初始化所有信號(hào)燈
void sem_init_all(int sem_id,unsigned short vals[])
{
union semun su;
su.array = vals;
if(semctl(sem_id,0,SETALL,su) < 0){
perror("semctl");
exit(1);
}
}
?
總結(jié)
? ? ? ? 本篇文章針對(duì)進(jìn)程間通信system V IPC對(duì)象進(jìn)行詳細(xì)講解,希望能夠幫到大家!
? ? ? ? 以后還會(huì)給大家展現(xiàn)更多關(guān)于嵌入式和C語言的其他重要的基礎(chǔ)知識(shí),感謝大家支持懶大王!
? ? ? ?希望這篇博客能給各位朋友們帶來幫助,最后懶大王請(qǐng)來過的朋友們留下你們寶貴的三連以及關(guān)注,感謝你們!
?
?
到了這里,關(guān)于C/C++ 進(jìn)程間通信system V IPC對(duì)象超詳細(xì)講解(系統(tǒng)性學(xué)習(xí)day9)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!