Linux訊號量和共享記憶體

2021-10-06 09:46:40 字數 2045 閱讀 8590

#include

#include

#include

#include

#include

#include

#include

#include

static

intset_semvalue

(void);

static

intsemaphore_p

(void);

static

intsemaphore_v

(void);

static

void

del_sem_set

(void);

/* 定義自己的semun聯合體*/

union semun

;/* 定義全域性變數sem_id儲存訊號量集的識別符號*/

static

int sem_id;

/* 定義全域性變數shm_id儲存共享記憶體的識別符號*/

static

int shm_id;

intmain()

if(!set_semvalue()

) shm_id =

shmget

(ipc_private,

4096

,0666

| ipc_creat);if

(shm_id ==-1

) pid =

fork()

;/* 建立子程序*/

if(pid ==-1

)else

if(ch1 ==

'z')

break

;semaphore_v()

;sleep(1

);}while(1

);}else

semaphore_v()

;}while(1

);}}

shmdt

(pdata)

;/* 分離*/}if

(pid >0)

printf

("\n%d - finished\n"

,getpid()

);exit

(exit_success);}

/* 設定訊號量的值*/

static

intset_semvalue

(void

)/* p操作,獲取訊號量*/

static

intsemaphore_p

(void

)return1;

}/* v操作,釋放訊號量*/

static

intsemaphore_v

(void

)return1;

}/* 刪除訊號量集*/

static

void

del_sem_set

(void

)

描述:父程序迴圈隨機產生大寫字母,並寫入共享記憶體,子程序從共享記憶體中讀取到該字母後將其轉換為相應的小寫字母並將該小寫字母寫入共享記憶體,最後父程序讀取共享記憶體中被修改後的小寫字母並輸出。

mmddwwllsswwmmuuiiyyqqqqrryywwkkssjjsszz
1)試說明父子程序都包括讀和寫,但它們的順序有什麼不同?

子程序時先讀取共享記憶體再寫入,父程序是先寫入共享記憶體再讀取。根據程式的邏輯,父程序向共享記憶體寫入資料,子程序收到並修改之後父程序再讀取並顯示。

2)父程序讀寫分別各用一次訊號量互斥訪問,而子程序讀寫共用一次型號量互斥訪問,試說明原因?

父程序讀寫各用一次訊號量互斥訪問,而子程序只用了一次。這是因為父程序寫完以後不能馬上讀取,要釋放訊號量讓子程序讀取並修改。所以父程序的訊號量控制要讀寫分離。

3)共享記憶體的第二個記憶體用特殊字元「#」或「@」有什麼用途?

共享記憶體中的第二個字元「#」或「@」用來標識當前字元為大寫還是小寫,若為「#」則表明當前字元為小寫,就可以輸出顯示。若為「@」就表明當前字元為大寫,需要子程序修改。

共享記憶體和訊號量

共享記憶體和訊號量實現程序間通訊的另外兩種機制。一.共享記憶體 1.共享記憶體的結構 2.實現共享記憶體的函式 1 shmget 函式 功能 建立共享記憶體 引數 key 共享記憶體的名字 size 共享記憶體的大小 以頁為單位分配資源 返回值 成功返回乙個非負整數,即共享記憶體的識別符號 失敗返回...

共享記憶體,訊號量

一.共享記憶體 共享記憶體 允許兩個不相關的程序訪問同乙個邏輯記憶體。為兩個正在執行的程序之間共享和傳遞資料不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址,是非同步通訊,也就是說,在第乙個程序結束對共享記...

共享記憶體 訊號量

1.共享記憶體 a.int shmget key t key,size t size,int shm 建立共享記憶體 參一 為共享記憶體段命名 參二 size以位元組為單位指定需要共享的記憶體容量 參三 許可權標誌 ipc creat 0644 返回值 共享記憶體識別符號 非負整數 b.void s...