QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1250|回复: 10

我刚写得生产者消费者程序(已经传上来了)

[复制链接]
发表于 2003-4-6 21:58:02 | 显示全部楼层 |阅读模式
我刚写得生产者消费者程序
请大家指点。
我打了一个包。
解开后,
./configure&&make&make install
然后在其目录下。执行
用BASH。
发表于 2003-4-6 22:05:20 | 显示全部楼层
好像没有传上来,和llc联系一下。
回复

使用道具 举报

发表于 2003-4-6 23:15:48 | 显示全部楼层
不错,看起来是一个学计算机专业的学生.这个程序每个老师都要求写
你弄一个好的上来
以后的学生就不受苦啦

不过说实话,还是自己写一个好
当时我就是自己写的

如果你顺便把哲学家吃饭的问题解决了那就更好了

你可以直接把你的程序贴出来,记得加上code标记
回复

使用道具 举报

 楼主| 发表于 2003-4-7 18:08:42 | 显示全部楼层
是好像没有发上来。。
上来了。哈哈。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2003-4-7 18:13:25 | 显示全部楼层
是好像没有发上来。。
上来了。哈哈。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2003-4-7 22:07:04 | 显示全部楼层
不管那么多,先帖出来呦~
[code:1]
/* File:producer-consumer.c */
/* write by Zhang Yuqiang([email protected])
   Computer Science of Shandong University .
   enviroment: RedHat Linux 9.0  gcc3.2
   Just fun!
   2003.04.06 */
//--------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <linux/sem.h>

#define NUM_LOOPS 20

int main(int argc,char *argv[])
{
      int sem_set_id;           //the ID of semaphore set   
      union semun sem_val;      //the value of semaphore
      int child_pid;            //child process ID
      struct sembuf sem_op;     //the struct of semaphore operate
      int i;
      int rc;                   //return value
      struct timespec delay;
//create sem_set,only one sem have.
      sem_set_id=semget(IPC_PRIVATE,1,IPC_CREAT|0600);
//    if (sem_set_id=-1){
//        perror("main:semget");
//        exit(1);
//    }
      printf("semaphore set created,semphore set ID:'%d'.\n",sem_set_id);
//set semaphore value to zero.
      sem_val.val=0;
      rc=semctl(sem_set_id,0,SETVAL,sem_val); //set first semaphore to zero
//create child process
      child_pid=fork();
      switch (child_pid){
            case -1: //failed
                   perror("fork");
                   exit (1);
            case 0:  //in child process
                   for (i=0;i<NUM_LOOPS;i++){
                     //blocked,until semaphore value above or equall zero
                        sem_op.sem_num=0;
                        sem_op.sem_op=-1;
                        sem_op.sem_flg=0;
                        semop(sem_set_id,&sem_op,1);
                        printf("consumer: '%d'\n",i);
                        fflush(stdout);
                    }
                    break;
            default:  //in parent process
                    for (i=0;i<NUM_LOOPS;i++){
                        printf("producer: '%d'\n",i);
                        fflush(stdout);
                      //increase the semaphore value
                        sem_op.sem_num=0;
                        sem_op.sem_op=1;
                        sem_op.sem_flg=0;
                        semop(sem_set_id,&sem_op,1);
                     //wait for a moment
                         if (rand()>3*(RAND_MAX/4)) {
                            delay.tv_sec=0;
                            delay.tv_nsec=10;
                            nanosleep(&delay,NULL);
                            }
                     }
                     break;
         }
         return 0;
}
//-------------------END---------------------------------
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2003-4-7 22:10:28 | 显示全部楼层
continue~~
[code:1]
/* File: mutex-semaphore.c */
/* write by Zhang Yuqiang([email protected])
   Computer Science of Shandong University
   environment Redhat linux 9.0 with gcc3.2
                                 2003.04.07
   Good luck!                             */
//-----------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <linux/sem.h>

#define NUM_PROCS 5
#define SEM_ID 250
#define FILE_NAME "/tmp/sem.txt"
#define DELAY 400000

void update_file(int sem_set_id,char *file_path,int number)
{
          struct sembuf sem_op;
          FILE *file;
          //wait for the semaphore value above or equall zero
          sem_op.sem_num=0;
          sem_op.sem_op=-1;
          sem_op.sem_flg=0;
          semop(sem_set_id,&sem_op,1);
          //write the PID into file
          file=fopen(file_path,"w");
          if (file) {
                 fprintf(file,"%d\n",number);
                 printf("%d\n",number);
                 fclose(file);
          }
          //add the semaphore value
          sem_op.sem_num=0;
          sem_op.sem_op=1;
          sem_op.sem_flg=0;
          semop(sem_set_id,&sem_op,1);
}
//--------child process write the file--------------
void do_child_loop(int sem_set_id,char *file_name)
{
          int pid=getpid();
          int i,j;
          for (i=0;i<3;i++){
                update_file(sem_set_id,file_name,pid);
                for (j=0;j<DELAY;j++);
          }
}
//-----------------MAIN----------------------------

int main(int argc,char *argv[])
{
          int sem_set_id;      //the semaphore set's ID
          union semun sem_val; //the value of semaphore
          int child_pid;       //the child process's ID
          int i;
          int rc;              //return value
          //create semaphore set,ID is 250,only one semaphore
          sem_set_id=semget(SEM_ID,1,IPC_CREAT | 0600);
          if (sem_set_id==-1){
                 perror("main:semget");
                 exit(1);
          }
                           
          sem_val.val=1;        //set semaphore value to 1
          rc=semctl(sem_set_id,0,SETVAL,sem_val);
          if (rc==-1){
                 perror("main:semctl");
                 exit(1);
          }
          //create some child processes.
          for (i=0;i<NUM_PROCS;i++){
                 child_pid=fork();
          switch(child_pid){
                case -1:
                       perror("fork");
                       exit(1);
                case 0:         //implayment child process
                       do_child_loop(sem_set_id,FILE_NAME);
                       exit(0);
                default:        //implayment parent process
                       break;
                 }
          }
         //wait the child process end
          for (i=0;i<NUM_PROCS;i++){
                int child_status;
                wait(&child_status);
          }

         printf("Main:We're done\n");
         fflush(stdout);
         return 0;
}
//-----------------------------------------------
         
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2003-4-7 22:17:47 | 显示全部楼层
请大家指点...
回复

使用道具 举报

发表于 2003-4-7 22:25:23 | 显示全部楼层
老了老了
我还的先去看看操作系统的书才知道是不是正确的

conner看看呢?
回复

使用道具 举报

 楼主| 发表于 2003-4-7 22:43:28 | 显示全部楼层
不过从结果看应该是对的吧。
回复

使用道具 举报

 楼主| 发表于 2003-4-9 19:35:12 | 显示全部楼层
我顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 04:38 , Processed in 0.049432 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表