LinuxSir.cn,穿越时空的Linuxsir!

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

请高手帮忙!关于信号量的!

[复制链接]
发表于 2004-12-27 23:50:44 | 显示全部楼层 |阅读模式
信号量实现的同步互斥机制!
编制两个程序,一个是写者,其行为如下:
1)随机产生一个1-100的整数,
2)打印自己的进程号以及这个整数,并将这个整数存到已固定文件
3)随机睡眠1-10秒
4)重复1,2,3步骤
另一个程序是写者,其行为如下:
1)从上述固定的文件读取这个整数
2)打印自己的进程号以及这个整数
3)随机睡眠1-3秒
4)重复1,2,3步骤
要求:
1)读者和写者可以有多个实例同时运行
2)读者和读者可以同时打开一个文件,读者和写者必须互斥,写者和写者也必须互斥!
发表于 2004-12-28 10:14:30 | 显示全部楼层
作业还是自己做的,有什么不懂的再问。
 楼主| 发表于 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) ;
    }

}
 楼主| 发表于 2004-12-28 13:29:04 | 显示全部楼层
我的程序是否用到了信号量(信号量在我的程序是否确实起到了控制资源的作用?)怎么样测试我的程序中信号量起到了作用呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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