|

楼主 |
发表于 2004-12-28 13:27:06
|
显示全部楼层
我写的写者:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/sem.h>
#include<sys/ipc.h>
int main()
{
#define WRITER 0
#define READERIN 1
FILE* reader ;
FILE* writer ;
int semid ;
int pid ;
int c ;
struct sembuf writers,readers,readerin ;
short array[2] = {1,0} ;/////////////用来初始化所创建的信号量
key_t mykey = 400 ;
pid = getpid() ;
semid = semget(mykey,2,IPC_CREAT) ;//系统调,创建一个信号量集,其中包含两个信号量,成功则返回信号量集的IPC标志符
semctl(semid,2,SETALL,array) ;//执行在信号量集上的控制操作,将两个信号量的值分别置为1,0;
writers.sem_flg = !IPC_NOWAIT ;
readerin.sem_flg = !IPC_NOWAIT ;
writers.sem_num = WRITER ;//设置要处理的信号量的数(第几号信号量?)
readerin.sem_num = READERIN ;
while(1)
{
writers.sem_op = -1 ;
readerin.sem_op = 0 ;
semop(semid,&readerin,1) ;////////进程等待资源完全空闲时使用
semop(semid,&writers,1) ;//如果sem_op是负值,那么信号量则减去它的值;如果没有使用IPC_NOWAIT,调用进程将进入睡眠状态;
//直到信号量控制的进程资源可用。如果sem_op为正数,则信号量加上它的值,这也就是进程释放信号量控制的资源。
//最后,如果sem_op=0,那么调用进程将调用sleep(),直到信号量为0。这在一个进程等待一个完全空闲的资源时使用。
c = rand() ;
writer = fopen("file","w") ;
fprintf(writer,"%d",c) ;
fclose(writer) ;
printf("process ID:%d and the number is:%d\n",pid,c) ;
sleep(rand()%10+1) ;
writers.sem_op = 1 ;
semop(semid,&writers,1) ;
}
return 0 ;
}
我写的读者:
int main()
{
#define WRITER 0
#define READERIN 1
FILE* reader ;
FILE* writer ;
int semid ;
int pid ;
int c ;
struct sembuf writers,readers,readerin ;
short array[2] = {1,0} ;
key_t mykey = 400 ;
pid = getpid() ;
semid = semget(mykey,2,IPC_CREAT) ;
while(!(reader=fopen("file","r")))
{
printf("writer have not write character into file!\n") ;
sleep(10) ;
}
fclose(reader) ;
writers.sem_flg = !IPC_NOWAIT ;
readerin.sem_flg = IPC_NOWAIT ;
writers.sem_num = WRITER ;
readerin.sem_num = READERIN ;
while(1)
{
writers.sem_op = -1 ;
readerin.sem_op = 1 ;
semop(semid,&readerin,1) ;
semop(semid,&writers,1) ;
reader = fopen("file","r") ;
fscanf(reader,"%d",&c) ;
printf("process ID:%d,and the number read from file is:%d\n",pid,c) ;
fclose(reader) ;
sleep(rand()%3+1) ;
readers.sem_op = 1 ;
writers.sem_op = 1 ;
readerin.sem_op = -1 ;
semop(semid,&readerin,1) ;
semop(semid,&writers,1) ;
}
} |
|