日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Linux编程题:信号量同步三进程依次打印若干次ABC

發布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。