国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C/C++ 進(jìn)程間通信system V IPC對(duì)象超詳細(xì)講解(系統(tǒng)性學(xué)習(xí)day9)

這篇具有很好參考價(jià)值的文章主要介紹了C/C++ 進(jìn)程間通信system V IPC對(duì)象超詳細(xì)講解(系統(tǒng)性學(xué)習(xí)day9)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

?

目錄

前言

一、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.流程圖解:

C/C++ 進(jìn)程間通信system V IPC對(duì)象超詳細(xì)講解(系統(tǒng)性學(xué)習(xí)day9),Ubantu和C語言學(xué)習(xí),學(xué)習(xí),c語言,c#,開發(fā)語言

2.查看linux內(nèi)核中的ipc對(duì)象:

C/C++ 進(jìn)程間通信system V IPC對(duì)象超詳細(xì)講解(系統(tǒng)性學(xué)習(xí)day9),Ubantu和C語言學(xué)習(xí),學(xué)習(xí),c語言,c#,開發(fā)語言

?文章來源地址http://www.zghlxwxcb.cn/news/detail-716528.html

?二、消息隊(duì)列

1.消息隊(duì)列的原理

C/C++ 進(jìn)程間通信system V IPC對(duì)象超詳細(xì)講解(系統(tǒng)性學(xué)習(xí)day9),Ubantu和C語言學(xué)習(xí),學(xué)習(xí),c語言,c#,開發(fā)語言

?

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 ? ? ? ? ? 5

peter@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.原理圖解

?C/C++ 進(jìn)程間通信system V IPC對(duì)象超詳細(xì)講解(系統(tǒng)性學(xué)習(xí)day9),Ubantu和C語言學(xué)習(xí),學(xué)習(xí),c語言,c#,開發(fā)語言

?

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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C/C++ 線程超詳細(xì)講解(系統(tǒng)性學(xué)習(xí)day10)

    C/C++ 線程超詳細(xì)講解(系統(tǒng)性學(xué)習(xí)day10)

    目錄 前言 一、線程基礎(chǔ) 1.概念 ?2.一個(gè)進(jìn)程中多個(gè)線程特征 2.1 線程共有資源 2.2 線程私有資源 ? 3.線程相關(guān)的api函數(shù) ?3.1 創(chuàng)建線程 創(chuàng)建線程實(shí)例代碼如下: ?需要特別注意的是: -lpthread和-pthread的區(qū)別 3.2 給線程函數(shù)傳參 ? 傳參實(shí)例代碼如下: 3.3 給線程收尸 收尸實(shí)例代碼

    2024年02月08日
    瀏覽(20)
  • C/C++運(yùn)算符超詳細(xì)講解(系統(tǒng)性學(xué)習(xí)day5)

    C/C++運(yùn)算符超詳細(xì)講解(系統(tǒng)性學(xué)習(xí)day5)

    目錄 前言 一、運(yùn)算符的概念與分類 二、算術(shù)運(yùn)算符 三、關(guān)系運(yùn)算符 ?四、邏輯運(yùn)算符 五、賦值運(yùn)算符 六、運(yùn)算符的優(yōu)先級(jí)? 總結(jié) ? 本篇文章是對(duì)運(yùn)算符的具體講解。 概念: 運(yùn)算符就是一種告訴編譯器執(zhí)行特定的數(shù)學(xué)或邏輯操作的符號(hào),用來表示針對(duì)數(shù)據(jù)的特定操作,也

    2024年02月07日
    瀏覽(25)
  • C/C++ stm32基礎(chǔ)知識(shí)超詳細(xì)講解(系統(tǒng)性學(xué)習(xí)day14)

    C/C++ stm32基礎(chǔ)知識(shí)超詳細(xì)講解(系統(tǒng)性學(xué)習(xí)day14)

    目錄 前言 一、ARM和STM32是什么? 二、STM32的開發(fā)方式 三、GPIO----寄存器開發(fā)方式 1.八種輸入輸出模式分析 2.寄存器? 四、stm32芯片圖片 五、怎么學(xué)好stm32? 總結(jié) stm32的廣泛含義及背景: STM32是一款由意法半導(dǎo)體(ST)公司開發(fā)的32位微控制器,其全稱是意法半導(dǎo)體32位系列微控

    2024年02月04日
    瀏覽(34)
  • C/C++網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)超詳細(xì)講解第二部分(系統(tǒng)性學(xué)習(xí)day12)

    C/C++網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)超詳細(xì)講解第二部分(系統(tǒng)性學(xué)習(xí)day12)

    ? ? ? ? ? ? 懶大王感謝大家的關(guān)注和三連支持~ ? ? ? 目錄 前言 一、UDP編程 UDP特點(diǎn): ?UDP框架: UDP函數(shù)學(xué)習(xí)? ?發(fā)送端代碼案例如下: 二、多路復(fù)用? 前提講述 select? poll 三、圖解如下? 總結(jié)? ? ? ?? 作者簡(jiǎn)介: ?懶大王敲代碼,正在學(xué)習(xí)嵌入式方向有關(guān)課程stm32,網(wǎng)絡(luò)

    2024年02月07日
    瀏覽(21)
  • C/C++網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)超詳細(xì)講解第一部分(系統(tǒng)性學(xué)習(xí)day11)

    目錄 前言 一、網(wǎng)絡(luò)的含義與構(gòu)成 含義: 構(gòu)成:? 二、網(wǎng)絡(luò)的體系結(jié)構(gòu) 1OSI七層模型 2TCP/IP協(xié)議體系結(jié)構(gòu)? 3數(shù)據(jù)經(jīng)過體系結(jié)構(gòu),怎么封裝?? 4端口號(hào) 5大小端序 6TCP/UDP傳輸層的協(xié)議? 三、系統(tǒng)函數(shù)API學(xué)習(xí)框架(TCP)? ?? 服務(wù)器(優(yōu)先): ?客戶端: 四、服務(wù)器和客戶端代碼實(shí)

    2024年02月08日
    瀏覽(26)
  • C/C++網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)超詳細(xì)講解第三部分(系統(tǒng)性學(xué)習(xí)day13)

    C/C++網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)超詳細(xì)講解第三部分(系統(tǒng)性學(xué)習(xí)day13)

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 懶大王感謝大家的關(guān)注和三連支持~ ?? 目錄 前言 一、并發(fā)服務(wù)器 1.進(jìn)程并發(fā)服務(wù)器 實(shí)例代碼如下:? 2.線程并發(fā)服務(wù)器 實(shí)例代碼如下:? 二、域通信 域通信TCP實(shí)例代碼如下:? 三、廣播與組播(UDP)? 1.廣播 實(shí)例代碼

    2024年02月05日
    瀏覽(22)
  • 【看表情包學(xué)Linux】IPC 進(jìn)程間通信 | PIPE 管道 | 匿名管道 | 管道通信的原理 | 系統(tǒng)調(diào)用: pipe 接口

    【看表情包學(xué)Linux】IPC 進(jìn)程間通信 | PIPE 管道 | 匿名管道 | 管道通信的原理 | 系統(tǒng)調(diào)用: pipe 接口

    ?? ??? 爆笑 教程 ????《看表情包學(xué)Linux》 ?? CSDN 累計(jì)訂閱量破千的火爆 C/C++ 教程的 2023 重制版,C 語言入門到實(shí)踐的精品級(jí)趣味教程。 了解更多: ?? ?\\\"不太正經(jīng)\\\" 的專欄介紹? ← 試讀第一章 訂閱鏈接: ?? 《C語言趣味教程》 ← 猛戳訂閱! 目錄 Ⅰ. 進(jìn)程間通信(I

    2024年02月14日
    瀏覽(24)
  • system-v IPC共享內(nèi)存通信

    system-v IPC共享內(nèi)存通信

    目錄 system v IPC簡(jiǎn)介 共享內(nèi)存需要用到的函數(shù)接口 shmget函數(shù)--獲取對(duì)象ID shmat函數(shù)--獲得映射空間 shmctl函數(shù)--釋放資源 共享內(nèi)存實(shí)現(xiàn)思路 注意 消息隊(duì)列、共享內(nèi)存和信號(hào)量統(tǒng)稱為system v IPC(進(jìn)程間通信機(jī)制),V是羅馬數(shù)字5,是UNIX的ATT分支的其中一個(gè)版本,一般稱它們?yōu)镮PC對(duì)象

    2024年04月26日
    瀏覽(22)
  • 環(huán)境編程代碼實(shí)例:進(jìn)程間通信(IPC)

    環(huán)境編程代碼實(shí)例:進(jìn)程間通信(IPC)。 yezhening/Environment-and-network-programming-examples: 環(huán)境和網(wǎng)絡(luò)編程實(shí)例 (github.com) Environment-and-network-programming-examples: 環(huán)境和網(wǎng)絡(luò)編程實(shí)例 (gitee.com) 低級(jí):3種 全局變量/glov:類似管道、命名管道、消息隊(duì)列、共享內(nèi)存:頭文件/庫(kù)文件全局變量

    2024年02月05日
    瀏覽(26)
  • Qt之進(jìn)程通信-IPC(QLocalServer,QLocalSocket 含源碼+注釋)

    Qt之進(jìn)程通信-IPC(QLocalServer,QLocalSocket 含源碼+注釋)

    如下,分別在各個(gè)界面的控件中填入key,依次連接。 如下,簡(jiǎn)單演示了server與全部、指定socket通信及接收socket發(fā)送的數(shù)據(jù)。 1.3.1 由Server主動(dòng)斷開連接 如下,演示了單獨(dú)斷開一個(gè)及斷開全部的操作,其中斷開操作是由server發(fā)送數(shù)據(jù)通知socket斷開,server這邊則等待斷開返

    2024年02月11日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包