|
请高手帮忙!关于信号量的!
--------------------------------------------------------------------------------
信号量实现的同步互斥机制!
编制两个程序,一个是写者,其行为如下:
1)随机产生一个1-100的整数,
2)打印自己的进程号以及这个整数,并将这个整数存到已固定文件
3)随机睡眠1-10秒
4)重复1,2,3步骤
另一个程序是写者,其行为如下:
1)从上述固定的文件读取这个整数
2)打印自己的进程号以及这个整数
3)随机睡眠1-3秒
4)重复1,2,3步骤
要求:
1)读者和写者可以有多个实例同时运行
2)读者和读者可以同时打开一个文件,读者和写者必须互斥,写者和写者也必须互斥!
问题:
(1) 我的程序是否用到了信号量(信号量在我的程序是否确实起到了控制资源的作用?)怎么样测试我的程序中信号量起到了作用呢?
(2) 怎样确保创建的信号量的初值有第一个写者所设置,而不让其他写者设置?
(3) 函数 int semctl(int semid ,int semnum,int cmd,union semun arg)
int semget(key_t,int nsems,int semflg)
int semop(int semid ,struct *sops,unsign ednsopsP)
具体用法说明?
我也查看了些资料,感觉有的表达不清晰,有歧义,希望哪为熟悉的能说明这些函数的用 法.
最好结合我这个例子示范一下!
(4)还特别问一下
我想创建两个信号量时,
int mykey=400;
short array[2]={1,0};
semid=semget(mykey,2,IPCNOWAIT);///方法1
semid=semget(mykey,2,IPCNOWAIT|0666);////方法2
方法1与方法2有什么区别?
接下来:
我想给所创建 的信号量设置初值,
semctl(semid,2,SETALL,array) ;//执行在信号量集上的控制操作,将两个信号量的值分别置 为1,0;
如果函数调用成功,是否我前面所创建的信号量初始化?第一个信号量值变为1,第2个变为0???
//////////////////////////////////////////////////////////////////////////////////////
以下是我写的程序:
我写的写者:
#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 IDd and the number isd\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 IDd,and the number read from file isd\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) ;
}
} |
|