Linux共享記憶體與訊號量

2021-09-13 13:34:39 字數 3710 閱讀 4633

最近在學習linux程序間的通訊。寫了一段**,加深學習印象

//sem_com.c

#include "sem_com.h"

//初始化訊號量

int init_sem(int sem_id, int init_value)

return 0;

}//刪除訊號量

int del_sem(int sem_id)

return 0;

}//p操作

int sem_p(int sem_id)

return 1;

}//v操作

int sem_v(int sem_id)

return 1;

}

//sem_com.h

#ifndef _sem_com_h_

#define _sem_com_h_

#include #include #include #include #include #include union semun

;//初始化訊號量

int init_sem(int sem_id, int init_value);

//刪除訊號量

int del_sem(int sem_id);

//p操作

int sem_p(int sem_id);

//v操作

int sem_v(int sem_id);

#endif

//commun_server.c

#include "communition.h"

#include "sem_com.h"

//#include "date_type.h"

void ignor_signal(void);

int main(int argc, char *ar**)

; char quit_flag = "quit";

// 忽略一些系統訊號

// ignor_signal();

//訊號量的處理

if((key = ftok(".", 'a')) == -1)

if((sem_id = semget(key, 1, 0666|ipc_creat)) == -1)

else

//共享記憶體的處理

if((shm_id = shmget(key, sizeof(shm_date_type), ipc_creat|0666)) == -1)

else }

printf("shmat addr:%x\n",(int)shm_addr);

doshm_data.pid = getpid();

memset(shm_data.buffer, 0, sizeof(shm_data.buffer));

if(fgets(shm_data.buffer, shm_buffer_size, stdin) == null)

strncpy(shm_addr, shm_data.buffer, strlen(shm_data.buffer));

//釋放占用的資源v操作

if(sem_v(sem_id) == -1)

printf("shm_data.buffer:%s\n", shm_data.buffer);

}while((strncmp(shm_data.buffer, quit_flag, strlen(quit_flag))));

del_sem(sem_id);

if(shmdt(shm_addr) == -1)

exit(0); }

void ignor_signal(void)

//commun_client.c

#include "communition.h"

#include "sem_com.h"

//#include "date_type.h"

void ignor_signal(void);

int main(int argc, char *ar**)

; char quit_flag = "quit";

// 忽略一些系統訊號

// ignor_signal();

//訊號量的處理

if((key = ftok(".", 'a')) == -1)

if((sem_id = semget(key, 1, 0666)) == -1)

else

//共享記憶體的處理

if((shm_id = shmget(key, sizeof(shm_date_type), ipc_creat|0666)) == -1)

else }

printf("shmat addr:%x\n",(int)shm_addr);

doshm_data.pid = getpid();

memset(shm_data.buffer, 0, sizeof(shm_data.buffer));

strncpy(shm_data.buffer, shm_addr, strlen(shm_addr));

printf("shm_data.buffer len:%d\n", strlen(shm_addr));

//memcpy(shm_data, shm_addr, sizeof(shm_buffer_size));

//釋放占用的資源v操作

//把記憶體中的資料讀完之後,資料還是存在的,需要把資料在清除掉

memset(shm_addr, 0, strlen(shm_addr));

if(sem_v(sem_id) == -1)

printf("get shmbuf some::%s\n", shm_data.buffer);

}while((strncmp(shm_data.buffer, quit_flag, strlen(quit_flag))));

del_sem(sem_id);

if(shmdt(shm_addr) == -1)

exit(0); }

void ignor_signal(void)

#ifndef __communition_h__

#define __communition_h__

#include #include #include #include #include #include #include #include #include #include "date_type.h"

void error_callback(char *err_msg);

typedef struct

shm_date_type;

#endif //__communition_h__

1、訊號量可以理解為是乙個全域性的變數,他的值就是資源。被占用了,資源-1,釋放了,資源+1。

2、當p操作,沒有可用資源時,會一直阻塞。

3、只要建立訊號量的semget使用的key是一樣的,那就是代表同乙個訊號量,這個key可以是認為這個訊號量的鑰匙嗎?

4、共享記憶體,把一段核心空間的記憶體對映在程序中。讀端在讀取資料後,下次讀取發現尾部還殘留了上次的資料。每次讀取完畢之後memset沒有復現此問題。應該是讀取資料之後並不會清除掉,要手動清除。

共享記憶體,訊號量

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

共享記憶體 訊號量

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

Linux訊號量和共享記憶體

include include include include include include include include static intset semvalue void static intsemaphore p void static intsemaphore v void stat...