貼一篇**,我們作業系統老師布置的作業,由單訊號量,改為乙個訊號集中多訊號量。水平有限,寫的不好。
#include #include #include #include #include #include #include//提供了共享記憶體的相關操作
#include#includeunion semun arg;
//生成訊號量
//訊號量建立
//第乙個:同步訊號量,表示先後順序,必須有空間才能生產
//第二個:同步訊號量,表示先後順序,必須有產品才能消費
//第三個:互斥訊號量,生產者和每個消費者不能同時進入緩衝區
int sem_creat(key_t key)
semctl(semid, 0, setval, sem[0]);//初始訊號量集中的第乙個訊號量
semctl(semid,1,setval,sem[1]);//第二個
semctl(semid,2,setval,sem[2]);//第三個
return semid;
}//刪除訊號量
void del_sem(int semid)
//p操作
int p(int semid,int semindex)
;//這裡的「semindex」是訊號量集裡的訊號量序號
return (semop(semid, &sops, 1));
}//v操作
int v(int semid,int semindex)
;//這裡的「semindex」是訊號量集裡的訊號量序號
return (semop(semid, &sops, 1));
}int buffer;
int num=5;
int *pdata;
int value_read = 0, value_write = 0;
int full, empty,all;
int start=0,end=0;
void producer(key_t);
void consumer(int);
int main(void)
if(ftruncate(fd, sizeof(int)*5) == -1) /* 截短共享記憶體的長度到我們所需要的長度 */
if((ptr = mmap(0, sizeof(int)*5, prot_read | prot_write, map_shared, fd, 0)) == map_failed) /* 將共享記憶體對映到程序位址空間 */
pdata = (int *)ptr;
//keyfull = ftok("/", 0);
//keyempty = ftok("/", 1);
key=ftok("/", 0);
//full = sem_creat(keyfull, 0);
//empty = sem_creat(keyempty, 1);
all=sem_creat(key);
switch(pid = fork())
wait(0);
shm_unlink("/shm"); /* 刪除共享記憶體區,程式中基本上保證了子程序先退出,因此父程序中無wait操作且這部操作放在父程序這裡 */
//shmctl(shmid,ipc_rmid,&buf);
//del_sem(semid);
return 0;
}/* 生產者寫5次後退出 */
//void producer(key_t keyfull, key_t keyempty)
void producer(key_t key)
}/* 消費者讀5次後退出 */
//void consumer(int full, int empty)
void consumer(int all)
}//gcc -lrt p.c (-o 目標檔名)
//./a.out
linux 訊號量使用
訊號量的資料型別為結構sem t,它本質上是乙個長整型的數。函式sem init 用來初始化乙個訊號量。它的原型為 extern int sem init p sem t sem,int pshared,unsigned int value sem為指向訊號量結構的乙個指標 pshared不為 時此...
Linux下的訊號量
linux下的訊號量本身就是臨界資源,所以pv操作都是原子操作。下面是實現二元訊號量的 二元訊號量就是互斥鎖。訊號量 中的semop函式是進行pv操作的核心函式,semop的函式原型為 int semop int semid,struct sembuf sops,unsigned nsops 第乙個...
linux下訊號量詳解
訊號量 訊號量實際上就是乙個計數器,用於控制程序或執行緒對臨界資源的同步與互斥,對訊號量的操作是乙個原子操作 也就是在乙個程序或執行緒訪問它時,其它的程序或執行緒不能同時訪問它來打斷前乙個程序或執行緒的操作 它的原理就是在乙個程序或執行緒過來時,先訪問訊號量,如果這個訊號量大於0,則讓計數 1,然後...