linux实现三个进程(A,B,C)顺次打印A,B,C

linux实现三个进程(A,B,C)顺次打印A,B,C

这个题目关键在于如何使三个程序依次有序的打印出A,B,C。
在这里,我通过信号灯实现

信号灯的讲解:https://blog.csdn.net/wfea_lff/article/details/104093277
之前已经讲过信号灯,这里就不多说了
如何让三个没有亲缘关系的进程有序的打印:就好比三个人依次报数一样,只有第二个人听到第一个人报数之后才会喊出他所代表的数字,类比回来,我们如何让进程之间知道先后顺序,即有顺序的运行

想到这里我们就可以通过信号灯,也就是信号量进行操作
信号量可以简单的理解为资源
当信号量的值为1的时候就认为此时有一个资源可用,0即为没有资源可用

我们举个例子
当两个用户对一个信号量的值为1的资源进行操作时,这两个用户总会有一个用户先进行操作,另一个会阻塞,因为资源数为1,当此时占用该资源的用户离开时,资源被让了出来,另一个用户便从阻塞状态变为操作状态,其实就是信号量/信号灯中的P/V操作

说到这里,这个问题便很容易解决了

1.先进行准备工作

假设我们创建一个信号灯,其内部含有三个信号量,例如:sem【0】,sem【1】,sem【2】,并对其依次初始化为1,0,0

2.对A程序限定

我们在打印A的程序里,在打印语句之前,先让A程序去获取sem【0】的资源(P操作),获取资源成功便运行,在打印语句之后加上对第二个信号量sem【1】进行V操作

3.对B程序限定

我们在打印B的程序里,在打印语句之前,先让B程序去获取sem【1】的资源(P操作),获取资源成功便运行,在打印语句之后加上对第三个信号量sem【2】进行V操作。

4.对C程序限定

我们在打印C的程序里,在打印语句之前,先让C程序去获取sem【2】的资源(P操作),获取资源成功便运行,在打印语句之后加上对第一个信号量sem【0】进行V操作。

至此整个编程逻辑已经出来

参考代码:

程序运行结果:

在这里插入图片描述

A程序

#include <stdio.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>

union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short  *array;
    struct seminfo  *__buf;
};

int main()
{
    key_t key = ftok(".",123);
    if(key<0)
    {
        printf("creat semaphore's key fail\n");
        return -1;
    }
    
    int semid = semget(key,3,IPC_CREAT|0777);
    if(semid<0)
    {
        printf("creat semaphore fail\n");
        return -2;
    }

    union semun mysem[3];
    mysem[0].val = 1;
    semctl(semid,0,SETVAL,mysem[0]);

    mysem[1].val = 0;
    semctl(semid,1,SETVAL,mysem[1]);

    mysem[2].val = 0;
    semctl(semid,2,SETVAL,mysem[2]);
    
    struct sembuf mybuf[2];
    mybuf[0].sem_op = -1;
    mybuf[0].sem_num = 0;
    mybuf[0].sem_flg = 0;

    mybuf[1].sem_op = 1;
    mybuf[1].sem_num = 1;
    mybuf[1].sem_flg = 0;
    
    int i = 5;
    while(i)
    {
        semop(semid,&mybuf[0],1);
        sleep(1);
        printf("A\n");
        i--;
        semop(semid,&mybuf[1],1);
    }
    return 0;
}

B程序

#include <stdio.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>

union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short  *array;
    struct seminfo  *__buf;
};

int main()
{
    key_t key = ftok(".",123);
    if(key<0)
    {
        printf("creat semaphore's key fail\n");
        return -1;
    }
    
    int semid = semget(key,3,IPC_CREAT|0777);
    if(semid<0)
    {
        printf("creat semaphore fail\n");
        return -2;
    }
    
    struct sembuf mybuf[2];
    mybuf[0].sem_op = -1;
    mybuf[0].sem_num = 1;
    mybuf[0].sem_flg = 0;

    mybuf[1].sem_op = 1;
    mybuf[1].sem_num = 2;
    mybuf[1].sem_flg = 0;
    
    int i = 5;
    while(i)
    {
        semop(semid,&mybuf[0],1);
        sleep(1);
        printf("B\n");
        i--;
        semop(semid,&mybuf[1],1);
    }
    return 0;
}

C程序

#include <stdio.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>

union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short  *array;
    struct seminfo  *__buf;
};

int main()
{
    key_t key = ftok(".",123);
    if(key<0)
    {
        printf("creat semaphore's key fail\n");
        return -1;
    }
    
    int semid = semget(key,3,IPC_CREAT|0777);
    if(semid<0)
    {
        printf("creat semaphore fail\n");
        return -2;
    }
    
    struct sembuf mybuf[2];
    mybuf[0].sem_op = -1;
    mybuf[0].sem_num = 2;
    mybuf[0].sem_flg = 0;

    mybuf[1].sem_op = 1;
    mybuf[1].sem_num = 0;
    mybuf[1].sem_flg = 0;
    
    int i = 5;
    while(i)
    {
        semop(semid,&mybuf[0],1);
        sleep(1);
        printf("C\n");
        i--;
        semop(semid,&mybuf[1],1);
    }
    return 0;
}
发布了28 篇原创文章 · 获赞 0 · 访问量 993

猜你喜欢

转载自blog.csdn.net/wfea_lff/article/details/104094251
今日推荐