天天看點

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",);

     //建立一個信号量
     semid = semget(key,,IPC_CREAT);

     semctl(semid,,SETVAL,);

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

     sleep();

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

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

     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",);//建立一個鍵值

     semid = semget(key,,IPC_CREAT);//擷取信号量
               //IPC_CREAT指令如果鍵值不存在就建立

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

     //法二:采用信号量機制
     sops.sem_num = ;//要操作的信号量序号
     sops.sem_op = -;//設定為自減1
     sops.sem_flg = SEM_UNDO;//要操作的信号量序号
     semop(semid,&sops,);//執行操作

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


}
           

繼續閱讀