进程间通信-信号量2

作业: A, B 两个进程, 首先, A 进程获取用户输入, 当 A 进程获取的用户输入是“OK”时, B 进程输出 100 以内所有的素数。
分析:
可以利用信号量实现 A,B 进程的同步, 首先, B 进程阻塞在信号量的 P 操作(信号量初始值 == 0), 当 A 进程获取到“OK” 时, 对信号量进行 V 操作。

信号量:为了协调进程对资源的访问(即资源共享)

有两个进程A和B,A触发ok时B执行输出操作:
miana.c

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/sem.h>
#include <string.h>
#include <unistd.h>

void amin()
{
    sem_get(); //获取或创建一个信号量
    while(1)
    {
        printf("please input:");
        char buff[128] = {0};
        fgets(buff,127,stdin); //用户输入
        if (strncmp(buff,"ok",2) == 0) //用户输入ok
        {
            sem_v(); //运行
        }
        if (strncmp(buff,"end",3) == 0) //用户输入end
        {
            sem_p(); //阻塞
        }
    }
}

mainb.c

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/sem.h>
#include <string.h>
#include <unistd.h>

void main()
{
    sem_get(); 
    sem_p();  //pv操作
    printf("输出素数");
}

sem.h

union semun  //联合体由sem.h(程序员)定义
{
    int val;
};

void sem_get();
void sem_p();
void sem_v();
void sem_del();

sem.cpp

#include "sem.h"

void sem_get() //获取(创建)一个信号量,创建信号量时设置一个初值
{
    semid = sem_get((key_t)1234,0,0664); //(0664操作权限)获取
    if (semid == -1)
    {
        semid = sem_get((key_t)1234,1,0664 | IPC_CREAT); //创建
        assert(semid != -1);

        union semun sval;
        sval.val = 0;

        semctl(semid,0,SETVAL,sval);//标志号,编号,初始化,初始化的值
    }
}

void sem_p() //阻塞操作
{
    struct sembuf buf;
    buf.sem_num = 0;  //编号(操作目标的数组下标)
    buf.sem_op = -1;  //操作
    buf.sem_flg = SEM_UNDO;  //标志

    semop(semid,&buf,1);//标识符,操作,信号量个数
}

void sem_v() //运行操作
{
    struct sembuf buf;
    buf.sem_num = 0;
    buf.sem_op = 1;
    buf.sem_flg = SEM_UNDO;

    semop(semid,&buf,1);
    //对semid这个信号量指定的变量进行操作,是选择发送(+1)还是等待(-1);
}

void sem_del()
{
    semctl(semid,0,IPC_RMID); //删除信号量
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值