进程间通讯---信号量练习(二)

本文介绍了一个使用信号量实现的进程间通讯案例。案例包括两个进程:A进程负责接收用户输入,当输入为“OK”时通知B进程;B进程收到通知后输出100以内的所有素数。通过此案例,读者可以了解进程间如何利用信号量进行同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

练习:
A, B 两个进程,首先,A 进程获取用户输入,当 A 进程获取的用户输入是“OK”
时, B 进程输出 100 以内所有的素数。
sem.h:

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

union semun
{
    int val;
}
void sem_get()
{
    semid = semget((key_t)1234,0,0666);
    if(semid == -1)
    {
        semid=semget((key_t)1234,1,0666| IC_CREAT);
        if(semid == -1)
        {
            exit(0);
        }
        union semun v;
        v.val = 0;
        semctl(semid,0,SETVAL,v);
    }

}
void sem_p()
{
    struct sembuf op;
    op.sem_num = 0;      //要操作的信号量编号
    op.sem_op = -1;
    op.sem_flg = SEM_UNDO;

    semop(semid,&op,1);
}
void sem_v()
{
    struct sembuf op;
    op.sem_num = 0;
    op.sem_op = 1;
    op.sem_flg = SEM_UNDO; //

    semop(semid,&op,1);
}

void sem_del()
{
    semctl(semid,0,IPC_RMID);  //用于删除一个已经无需继续使用的信号量
}

A进程:

void main()
{
    sem_get();
    while(1)
    {
        printf("please input:");
        char p[128]={0};
        fgets(p,127,stdin);
        if (strncmp (p,"ok",2) == 0)
        {
            sem_v();
        }

        if(strncmp(p,"end",3)== 0)
        {
            break;
        }
    }
    printf("write success\n");
}

B进程:

#include"sem.h"
#include<sys/sem.h>

void main()
{
    sem_get();
    sem_p();
    int i=2;
    for(;i<=100;i++)
    {
        int j=1;
        int count =0;
        for(;j<=i;j++)
        {
            if(i%j == 0 )
            {
                count ++;   
            }
        }
        if(count == 2)
        {
            printf("%d  ",i);
        }
    }
    printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值