• 大小: 3KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-15
  • 语言: 其他
  • 标签: 操作系统  

资源简介

参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。为了使得程序的输出易于看到结果,仿照的实例程序,分别在生产者和消费者进程的合适的位置加入一些随机睡眠时间。 可选的实验:在上面实验的基础上实现部分消费者有选择地消费某些产品。例如一个消费者只消费小写字符,一个消费者只消费大写字母,而另一个消费者则无选择地消费任何产品。消费者要消费的产品没有时,消费者进程被阻塞。注意缓冲的管理。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define maxn 15
struct shared{
      int written;
 char text[maxn];
 int inout;
};

union semun{
int val;
struct semid_ds *buf;
unsigned short *arry;
};

int Vsem(int semidint sem_num){
struct sembuf buf={sem_num+1SEM_UNDO};
if(semop(semid&buf1)==-1){
perror(“V failed.\n“);
return 0;
}
return 1;
}

int Psem(int semidint sem_num){
struct sembuf buf={sem_num-1SEM_UNDO};
if(semop(semid&buf1)==-1){
perror(“P failed.\n“);
return 0;
}
return 1;
}

int main()
{
        //
        key_t key;
        char *  path = “/home/crazycat/123“;
        key = ftok(path 1);
        if(key==-1)perror(“key error.\n“);
        //
        int shmid = shmget(key sizeof(struct shared) IPC_CREAT|0604);
        if(shmid==-1) perror(“shmid error.\n“);
        //
        int semid = semget(key 4 IPC_CREAT|0666);
        if(semid==-1){
           printf(“%s\n“strerror(errno));
           return 0;
        }
        union semun arg;
    arg.val = 1;
    semctl(semid 0 SETVAL arg);  //mutex1
    arg.val=1;
        semctl(semid 1 SETVAL arg);  //mutex2
        arg.val=0;
        semctl(semid 2 SETVAL arg);  //full_sem
        arg.val=maxn;
        semctl(semid 3 SETVAL arg);  //empty_sem
        //
        struct shared *  cache;
        if ((cache = (struct shared *)shmat(shmid NULL 0)) == (void *)-1) {
            perror(“shmat error.\n“);
         }
        cache->written=0;
        cache->in=0;
        cache->out=0;
        //
        pid_t pid[5];
        int i;
        for(i=0;i<5;i++){
            pid[i]=f

评论

共有 条评论