linux進程間的通信--信號量同步

1.核心理論

  • 進程的同步:是指一組併發的進程互相合作互相等待,使得各進程按照一定的順序執行的過程叫做進程同步。

  • 同步與互斥的區別:同步時信號量初始值爲0,互斥時信號量初始值大於0。
    解釋:如果用信號量互斥的話,必須是生產者進程先執行。如果採用信號量同步的話,那麼那麼生產者和消費者的執行順序不影響結果

2.進程同步編程實例

  • 消費者與生產者的關係
    生產者進程:創建一個文件,向文件中寫入字符,二者之間穿插一些休息
    消費者進程:該進程在生產者休息期間,讀取文件內容,導致中間出現一些問題。
    簡單來說就是必須要先生產完成,然後才能消費。

  • 生產者完成任務是才釋放信號量。

  • producter.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>   
#include <fcntl.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>

void main()
{
     int fd;
     key_t key;    
     int semid;
     struct sembuf sops;

     //創建一個鍵值
     key = ftok("home",1);

     //創建一個信號量
     semid = semget(key,1,IPC_CREAT);

     semctl(semid,0,SETVAL,0);

     fd = open("./pro.txt",O_RDWR|O_CREAT|O_APPEND,0777);

     sleep(15);

     write(fd,"welcome,linux!",14);

     //釋放信號量
     sops.sem_num = 0;
     sops.sem_op = 1;
     sops.sem_flg = SEM_UNDO;
     semop(semid,&sops,1);

     close(fd);
}
  • consumer.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

void main()
{
     key_t key;
     int semid;
     int ret;
     struct sembuf sops;

     key = ftok("home",1);//創建一個鍵值

     semid = semget(key,1,IPC_CREAT);//獲取信號量
               //IPC_CREAT命令如果鍵值不存在就創建

     /*法一:通過輪尋查看信號量是否釋放
     ret = semctl(semid,0,GETVAL);    
     printf("%d\n",ret);
     while(!(ret))
     ret = semctl(semid,0,GETVAL);     */

     //法二:採用信號量機制
     sops.sem_num = 0;//要操作的信號量序號
     sops.sem_op = -1;//設置爲自減1
     sops.sem_flg = SEM_UNDO;//要操作的信號量序號
     semop(semid,&sops,1);//執行操作

     system("cp ./pro.txt ./temp");


}
發佈了56 篇原創文章 · 獲贊 57 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章