訊號量的通訊

2021-09-30 09:55:29 字數 4451 閱讀 6431

《makefile》

##############################

# farsight's makefile

# write by stephenyee([email protected])

###############################

#installroot=$(pwd)

#cross_compile = arm-linux-gnu-

cc = $(cross_compile)gcc

ifdef cross_compile

target_fs_path = /opt/filesystem

endif

bin_path =$(target_fs_path)/root/long_term/ipc

install=install

#warnings = -wall \

#           -wundef -wpointer-arith -wbad-function-cast \

#           -wcast-align -wwrite-strings -wstrict-prototypes \

#           -wmissing-prototypes -wmissing-declarations \

#           -wnested-externs -winline -wcast-qual -w \

#           -wno-unused

#           -wunused

cflags= -o2 -dlinux $(warnings)

#libs= -lpthread

binary1 = producer

binary2 = customer

objs1 = producer.o sem_com.o

objs2 = customer.o sem_com.o

headers = shm_com.h sem_com.h

all:$ $

$ : $

$ $ $ -o $@ $^

$ : $

$ $ $ -o $@ $^

$ : $

$ : $

%.o : %.c 

$(cc) $(cflags) -c -o $@ $<

.phony: install uninstall clean dis

install: $(binary)

$(install) -s -m 755 -g root -o root $(binary) $(bin_path)

uninstall:

ifdef cross_compile

cd  $(bin_path) && rm -f  $  $

endif

clean : uninstall

- rm -f core *.gz

- rm -f $ $

- rm -f $ $

dist: clean

tar czf farsight_ipc_customer_product_demo1.0.tar.gz *.c *.h makefile

《標頭檔案》

/* sem_com.h */

#ifndef  sem_com_h

#define  sem_com_h

#include

#include

union semun

;int init_sem (int, int);

int del_sem (int);

int sem_p (int);

int sem_v (int);

#endif       /* sem_com_h */

《標頭檔案二》

/* shm_com.h */

#ifndef  shm_com_h

#define  shm_com_h

#include

#include

#include

#include

#include

#include

#include

#define shm_buff_sz 2048

struct shm_buff

;#endif       /* shm_com_h */

《另乙個pv程式設計》

/* sem_com.c */

#include "sem_com.h"

int init_sem (int sem_id, int init_value)

return 0;

}int del_sem (int sem_id)

}int sem_p (int sem_id)

return 0;

}int sem_v (int sem_id)

return 0;

}《write操作》

/* producer.c */

#include "shm_com.h"

#include "sem_com.h"

#include

int ignore_signal (void)

int main ()

/* 將共享記憶體位址對映到當前程序位址空間 */

shared_memory = shmat (shmid, (void *) 0, 0);

if (shared_memory == (void *) -1)

printf ("memory attached at %x\n", (int) shared_memory);

/* 獲得共享記憶體的對映位址 */

shm_buff_inst = (struct shm_buff *) shared_memory;

do shm_buff_inst->pid = getpid ();

sem_v (semid);

} while (strncmp (shm_buff_inst->buffer, "quit", 4) != 0);

/* 刪除訊號量 */

del_sem (semid);

/* 刪除共享記憶體到當前程序位址空間中的對映 */

if (shmdt (shared_memory) == 1)

exit (0);

}執行:

lsb@ubuntu:~/gx/wangluo$ ./msgsnd

open queue 0

enter some message to the queue(enter 'quit' to exit):寫字端,開始寫字

enter some message to the queue(enter 'quit' to exit):對方在等待,但是無法會回寫

enter some message to the queue(enter 'quit' to exit):你好!!

《read操作》

/* customer.c */

#include "shm_com.h"

#include "sem_com.h"

int main ()

/* 獲得共享記憶體 */

shmid = shmget (ftok (".", 'b'), sizeof (struct shm_buff), 0666 | ipc_creat);

if (shmid == -1)

/* 將共享記憶體位址對映到當前程序位址空間 */

shared_memory = shmat (shmid, (void *) 0, 0);

if (shared_memory == (void *) -1)

printf ("memory attached at %x\n", (int) shared_memory);

/* 獲得共享記憶體的對映位址 */

shm_buff_inst = (struct shm_buff *) shared_memory;

do shm_buff_inst->pid = 0;

memset (shm_buff_inst->buffer, 0, shm_buff_sz);

sem_v (semid);

} while (1);

/* 刪除共享記憶體到當前程序位址空間中的對映 */

if (shmdt (shared_memory) == -1)

/* 刪除共享記憶體 */

if (shmctl (shmid, ipc_rmid, null) == -1)

exit (0);

}執行:

lsb@ubuntu:~/gx/wangluo$ ./msgrcv

open queue 0

the message from process 3361 : 寫字端,開始寫字

the message from process 3361 : 對方在等待,但是無法會▒回寫

the message from process 3361 : 你好!!

訊號量通訊

linux程序間通訊 使用訊號 下面就進入訊號量的講解。一 什麼是訊號量 為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有乙個執行執行緒訪問 的臨界區域。臨界區域是指執行資料更新的 需要獨佔式地執行。而訊號量就可以提供這...

linux通訊 訊號量

程式主要參考 include include include include include include include union semun 必須自己定義 void p int k void v int k int main void char buf father int i 0,semi...

linux的訊號量通訊

檢視共享資訊的記憶體的命令是ipcs m s q 全部的話是ipcs a 檢視共享資訊的記憶體的命令是ipcs m s q 訊號量是乙個特殊的變數,程式對其訪問都是原子操作,且只允許對它進行等待 即p 訊號變數 和傳送 即v 訊號變數 資訊操作。最簡單的訊號量是只能取0和1的變數,這也是訊號量最常見...