进程间通信-信号量2

来源:互联网 发布:b2b源码授权费用 编辑:程序博客网 时间:2024/06/05 09:26

作业: 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); //删除信号量}