LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 670|回复: 1

我的程序是否可行?请高手帮忙!关于信号量的!

[复制链接]
发表于 2004-12-28 13:49:49 | 显示全部楼层 |阅读模式
请高手帮忙!关于信号量的!

--------------------------------------------------------------------------------


信号量实现的同步互斥机制!
编制两个程序,一个是写者,其行为如下:
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) ;
}

}
发表于 2004-12-29 19:29:59 | 显示全部楼层
贴代码时请保持缩进。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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