Linux编程题:信号量同步三进程依次打印若干次ABC
生活随笔
收集整理的這篇文章主要介紹了
Linux编程题:信号量同步三进程依次打印若干次ABC
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
三個進程依次打印ABC.....
思路及大致流程如下:
?思路取自這位大哥:
Linux編程題:創建3個線程分別打印abc,用信號量進行同步_cleverlemon的博客-CSDN博客
這位大哥寫的是線程,不需要自己封裝sem那些初始化函數,pv操作函數以及銷毀函數,這篇寫的是多進程,麻煩一些,大致思路一毛一樣
來看代碼實現:
先來對sem所需的初始化函數,pv操作函數,銷毀函數進行封裝:
sem.h
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys / sem. h>#define SEM_NUM 3
#define SEM1 0
#define SEM2 1
#define SEM3 2
union semun
{int val;
};
int sem_init( );
void sem_p( int index); //0,1,2因為有三個信號量 得對具體信號量進行操作
void sem_v(int index );
void sem destroy();
sem.c
#include "sem.h"static int semid = - 1;
int sem_init()
{semid = semget ( (key t)1234,SEM_NUM, IPC_CREAT|IPC_EXCL|0600);if ( semid == -1 ){semid = semget((key_t)1234,SEM_NUM,0600);if(semid == -1){ printf("semget err\n");return -1;}}else{int arr[SEM_NUM] = {1,0,0};for (int i = 0; i < SEM_NUM; i++){union semnu a;//給聯合體起別名aa.val = arr[i];if (semctl(semid, i, SETVAL, a) == -1) //semid是信號量集標識符 i是信號量集數組上的下標,表示某一個信號量 a是聯合體的別名 SETVAL是命令對信號量賦值{ printf("semctl err\n");return -1;}}}
}
void sem_p( int index)
{if ( index < 0 || index >= SEM_NUM ) //下標越界直接終止程序{return;}struct sembuf buf;buf. sem_num = index;buf.sem_op = -1;// p操作buf.sem_flg = SEM_UNDO; //防止獲得信號量之后程序異常結束 SEM_UNDO的作用就是幫你把信號量釋放if ( semop ( semid , &buf ,1)== -1 ){return :}}
void sem_v(int index)
{if ( index < 0 || index >= SEM_NUM ) //下標越界直接終止程序{return;}struct sembuf buf ;buf. sem_num = index;buf.sem_op = 1;// v操作buf.sem_flg = SEM_UNDO;if ( semop ( semid , &buf ,1)== -1 ) //這塊semop(semid,&buf,1)中的1就是只定義了1個信號量buf,如果后面是3的話 前面那塊就得寫buf[3]{return :}
}
void sem_destroy()
{if(semctl(semid,0,IPC_RMID) == -1) //這塊semctl(semid , 0 ,IPC_RMID)里面的參數,那個0激素個占位的作用 沒什么實質性的作用 銷毀的話 只需要semid和命令IPC_RMID就行了{return ;}
}
a.c的實現:
#include "sem. h"
int main()
{int res = sem_init();if (res == -1){return;}for (int i = 0; i < 5; i++) {sem_p(SEM1);printf("A"); //然后將該程序賦值三份 改一下pv操作中的參數 再給打印的A換成B/C fflush(stdout); sem_v(SEM2);}sem_destroy() :return 0;
}
b.c的實現:
#include "sem. h"
int main()
{int res = sem_init();if (res == -1){return;}for (int i = 0; i < 5; i++) {sem_p(SEM2);printf("B"); //然后將該程序賦值三份 改一下pv操作中的參數 再給打印的A換成B/C fflush(stdout); sem_v(SEM3);}sem_destroy():return 0;
}
c.c的實現:
#include "sem. h"
int main()
{int res = sem_init();if (res == -1){return;}for (int i = 0; i < 5; i++) {sem_p(SEM3);printf("C"); //然后將該程序賦值三份 改一下pv操作中的參數 再給打印的A換成B/C fflush(stdout); sem_v(SEM1);}sem_destroy():return 0;
}
所有代碼搞定? 來看執行
對所有程序進行編譯鏈接:
?運行結果:
?我編譯鏈接的時候semid給錯了? 所以打印出來就變成了CBA? 其實思想一樣的,依次打印就好了? 我就懶得改了!
“只有學習才可以讓生活變得充實起來!”
總結
以上是生活随笔為你收集整理的Linux编程题:信号量同步三进程依次打印若干次ABC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下进程间通信-------管道
- 下一篇: 蔡文姬作者是谁啊?