栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

杭电操作系统实验三-浅析

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

杭电操作系统实验三-浅析

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include //信号量头文件
#include 

#define MAX_PIPE_CAPACIPY 100


int main()
{
    int fd[2];
    sem_t *Mutex;
    sem_t *send1, *send2, *send3;
    sem_t *receive1, *receive2, *receive3;

    //创造有名信号量
    
    Mutex = sem_open("Mutex", O_CREAT, 0666, 1);//管道使用信号量
    send1 = sem_open("send1", O_CREAT, 0666, 1);//线程消息信号量,为一,表明子进程有消息发送,或者父进程有消息接受,
    send2 = sem_open("send2", O_CREAT, 0666, 1);
    send3 = sem_open("send3", O_CREAT, 0666, 1);
    receive1 = sem_open("receive1", O_CREAT, 0666, 0);
    receive2 = sem_open("receive2", O_CREAT, 0666, 0);
    receive3 = sem_open("receive3", O_CREAT, 0666, 0);

    int ret = pipe(fd);//创建无名管道,fd{0}只能读,fd{1}只能写,如果进程错误输出错误
    if (ret == -1)
     {
        printf("pipe create errorn");
        exit(-1);
     }

    //定义三个进程,创建三个信号量
    pid_t pid1;
    pid_t pid2;
    pid_t pid3;

    pid1 = fork();
    if(pid1 > 0)
     {
        pid2 = fork();
        if(pid2 > 0)
          {
            pid3 = fork();
          }
     }

    //pid不正常,则从系统中删除有名信号量,推出程序
    if(pid1 < 0 || pid2 < 0 || pid3 < 0)
     {
        sem_unlink("Mutex");
        sem_unlink("send1");
        sem_unlink("send2");
        sem_unlink("send3");
        sem_unlink("receive1");
        sem_unlink("receive2");
        sem_unlink("receive3");
        exit(0);//正常运行程序并退出程序
     }

    



     
    if(pid1 == 0)
     {
        close(fd[0]);//fd[0]对应管道的读口
        sem_wait(send1);//前面我们定义了send1为1,此处说明子进程产生消息。
        sem_wait(Mutex);//产生消息后,等待管道的使用权。

        char buf[3]="111";
        write(fd[1], buf, sizeof(buf));//在子进程中写入,
        printf("pid:%d 进程1放入数据:%sn",getpid(),buf);

        sleep(1);

        sem_post(Mutex);//释放信号量
        sem_post(receive1);

     }
    else if(pid2 == 0)
     {
        close(fd[0]);
        sem_wait(send2);
        sem_wait(Mutex);

        char buf[3]="222";
        write(fd[1], buf, sizeof(buf));
        printf("pid:%d 进程2放入数据:%sn",getpid(),buf);

        sleep(1);

        sem_post(Mutex);
        sem_post(receive2);
     }
    else if(pid3 == 0)
     {
        close(fd[0]);
        sem_wait(send3);
        sem_wait(Mutex);

        char buf[3]="333";
        write(fd[1], buf, sizeof(buf));
        printf("pid:%d 进程3放入数据:%sn",getpid(),buf);

        sleep(1);

        sem_post(Mutex);
        sem_post(receive3);

     }
    else//父进程
     {
        close(fd[1]);//关闭写,


        sem_wait(receive1);//读数据阻塞
        sem_wait(receive2);
        sem_wait(receive3);
        sem_wait(Mutex);

        char str[4096];

        read(fd[0], str, 4096);//读口读到的数据放在str里面

        printf("pid:%d 父进程接收数据:%sn", getpid(), str);

        sleep(1);

        sem_post(Mutex);
        sem_post(send1);
        sem_post(send2);
        sem_post(send3);

     }

    return 0;
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/957771.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号