手机版
你好,游客 登录 注册
背景:
阅读新闻

Linux进程间通信之信号量

[日期:2012-08-08] 来源:Linux社区  作者:bullbat [字体: ]
Linux进程间通信包括管道、消息队列、System V等等,其中System V包括三种:信号量、消息队列、共享内存,这里只简单介绍信号量机制。

在Linux编程中,要运用信号量实现互斥操作,用户空间需要调用几个系统调用,如下是一个用户空间例子。

#include <stdio.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

 

#define SEMKEY 1234L

#define PERMS 0666

 

struct sembuf op_down[1]={0,-1,0};

struct sembuf op_up[1]={0,1,0};

 

int semid=-1;

int res;

 

void init_sem()

{

         semid=semget(SEMKEY,0,IPC_CREAT |PERMS);

         if(semid<0)

         {

                   printf("create semaphore\n");

                   semid=semget(SEMKEY,1,IPC_CREAT| PERMS);

                  if(semid<0)

                   {

                            printf("couldn't create semaphore\n");

                            exit(-1);

                   }

 

                   res=semctl(semid,0,SETVAL,1);

         }

}

 

void down()

{

         res=semop(semid,&op_down[0],1);

}

 

void up()

{

         res=semop(semid,&op_up[0],1);

}

 

int main()

{

         init_sem();

         printf("beforecritical code\n");

         down();

         printf("incritical code\n");

         sleep(10);

         up();

         return0;

}

用户空间的程序中分为三步:

1,   调用semget系统调用创建信号量;

2,   调用semctl系统调用设置信号量初始值;

3,   调用semop系统调用实现同步互斥控制;

 

下面我们一步步看看内核中都是怎么实现的,内核中涉及到的关键数据结构与其主要的关系极其基本的操作如下图所示:

linux
本文评论   查看全部评论 (2)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
第 2 楼
* 班不女 发表于 2012/8/9 16:15:44
好几个
第 1 楼
* scott.cao 发表于 2012/8/8 18:20:14
还有socket哦