三个进程依次打印ABC.....
思路及大致流程如下:
思路取自这位大哥:
Linux编程题:创建3个线程分别打印abc,用信号量进行同步_cleverlemon的博客-CSDN博客
这位大哥写的是线程,不需要自己封装sem那些初始化函数,pv操作函数以及销毁函数,这篇写的是多进程,麻烦一些,大致思路一毛一样来看代码实现:
先来对sem所需的初始化函数,pv操作函数,销毁函数进行封装:
sem.h
#include#include #include #include #include #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 errn");
return -1;
}
}
else
{
int arr[SEM_NUM] = {1,0,0};
for (int i = 0; i < SEM_NUM; i++)
{
union semnu a;//给联合体起别名a
a.val = arr[i];
if (semctl(semid, i, SETVAL, a) == -1) //semid是信号量集标识符 i是信号量集数组上的下标,表示某一个信号量 a是联合体的别名 SETVAL是命令对信号量赋值
{
printf("semctl errn");
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 其实思想一样的,依次打印就好了 我就懒得改了!“只有学习才可以让生活变得充实起来!”



