zoukankan      html  css  js  c++  java
  • Linux下IPC中的信号量PV操作

    代码如下所示,两边对照查看程序!(左图为先运行进程 右图为后运行进程)

       

    运行的效果就是:当左边的进程检测到EOF,释放资源V操作之后,右边的进程会迅速的执行对应的printf的操作!

    所有代码文件结构如下:

    sem_a.c(左边进程的代码,编译方式:gcc sem_a.c sempv.c -o sem_a)

    #include <stdio.h>
    #include "sempv.h"
    
    int main(int *argc, char *argv[])
    {
        key_t my_key = 1234;
        int my_sem;
    
        my_sem = Create_sem(my_key,1,0666|IPC_CREAT);
        printf("setting val...
    ");
        init_sem(my_sem,0,1);
    
        printf("p...
    ");
        P(my_sem);
        while(getchar() != EOF);
        V(my_sem);
    
        sleep(5);
        del_sem(my_sem);
    
        return 0;
    }
    View Code

    sem_b.c(右边进程的代码,编译方式:gcc sem_b.c sempv.c -o sem_b)

    #include<stdio.h>
    #include "sempv.h"
    
    int main(int *argc, char *argv[])
    {
        key_t my_key = 1234;
        int my_sem;
    
        my_sem = Link_sem(my_key,1,0666);
    
        printf("p....
    ");
        P(my_sem);
        printf("sem1 finished!
    ");
        V(my_sem);
    
        return 0;
    }
    View Code

     sempv.c(PV操作的源程序,对应函数的实现)

    #include "sempv.h"
    
    //P操作,申请一个资源
    void P(int semid)
    {
        struct sembuf my_buf;
        memset(&my_buf,0,sizeof(my_buf));
        my_buf.sem_num = 0;
        my_buf.sem_op = -1;
        my_buf.sem_flg = SEM_UNDO;
        semop(semid,&my_buf,1);
    }
    
    void V(int semid)
    {
        struct sembuf my_buf;
        memset(&my_buf,0,sizeof(my_buf));
        my_buf.sem_num = 0;
        my_buf.sem_op = 1;
        my_buf.sem_flg = SEM_UNDO;
        semop(semid,&my_buf,1);
    }
    
    int Create_sem(key_t key,int index,int op)
    {
        int sem;
        sem = semget(key,index,op);
        if(sem == -1)
        {
            printf("semget error!
    ");
            exit(1);
        }
        return sem;
    }
    
    int Link_sem(key_t key,int index,int op)
    {
        int sem;
        sem = semget(key,index,op);
        if(sem == -1)
        {
            printf("semget error!
    ");
            exit(1);
        }
        return sem;
    }
    
    void init_sem(int sem,int index,int val) // Provent the sem be lock at the begin of the program!
    {
        semctl(sem,index,SETVAL,val);
    }
    
    void del_sem(int sem)
    {
        semctl(sem,0,IPC_RMID);
    }
    View Code

    sempv.h头文件声明

    #ifndef __SEMPV_H__
    #define __SEMPV_H__
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/ipc.h>
    #include<sys/sem.h>
    
    void P(int semid);
    void V(int semid);
    int Link_sem(key_t key,int index,int op);
    int Create_sem(key_t key,int index,int op);
    void init_sem(int sem,int index,int val);
    void del_sem(int sem);
    
    #endif
    View Code

    结论:从上述分析中我们可以得知,目前PV操作的库sempv.h/sempv.c的使用步骤如下:

  • 相关阅读:
    Asp.net分页控件AspNetPager的使用(DataList和Reapter结合Linq的编辑与删除)
    Zend Framework使用Extjs进行数据库交互和分页
    课程设计之(struts2+Hibernate)航空订票系统
    课程设计之(ZendFrameWrok)构建的航空订票系统网站
    Ubuntu10.10 Zend FrameWork配置及helloworld显示
    ExtJs、Struts2、Hibernate3.2登录页面的简单实现
    Asp.net的FileUpload控件的文件上传与Extjs文件上传的简单Demo
    学习linux的一些网络资源
    100条超搞笑的“雷人”QQ/MSN 签名
    超难的75道逻辑思维题
  • 原文地址:https://www.cnblogs.com/uestc-mm/p/10438629.html
Copyright © 2011-2022 走看看