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