down, up, sem_p, sem_v, sem_wait, sem_post 的区别

linux 信号量操作函数

2014-03-05 11:59 cheng6211  |  分类:Linux  |  浏览144次
down,     up,      sem_p,    sem_v,    sem_wait,    sem_post.    有什么区别
undefined reference to `down'  ,需要包含哪个头文件?
2014-03-05 14:05 提问者采纳
down和up函数在内核源代码的semaphore.h里。
你可以看一下/usr/src/内核的版本/include/linux里的源文件。
引入linux/semaphore.h,注意链接路径的环境变量要设对。

sem_p和sem_v没听说过,不过down和up分别对应的就是p和v,估计没什么区别,可能是新版本里的吧。

sem_wait和sem_post也是对应p和v,但它们不是linux内核库中的,是GNU C库里的,可以去/usr/include下看头文件。直接引入semaphore.h即可。

down和up操作的是linux内核里的信号量。
而sem_wait和sem_post应该遵循POSIX标准的,在编写多线程程序时,操作用户进程里的信号量,在其他操作系统中也有。
追问
写一个程序,gcc时,编译器是如何知道该代码里的信号量是内核信号量还是用户层的信号量?
我是在这个情况下遇到这个问题的:
我写了一个小程序,在里面开辟了一段共享内存,开了两个线程,
一个写线程,一个读线程,
进行同步和互斥时,
sem_p和sem_v,sem_wait和sem_post,可以,
down和up却不可以,提示为定义。
愿听详解
回答
down和up是写驱动时用的,用户程序里是用不了。内核模块和用户程序完全不一样,用的是两套C库。
 
      
 
      
       
       
       
       
  1. //函数:信号量P操作:对信号量进行减一操作  
  2. static int semaphore_p(void)  
  3. {  
  4.     struct sembuf sem_b;  
  5.   
  6.     sem_b.sem_num = 0;//信号量编号  
  7.     sem_b.sem_op = -1;//P操作   
  8.     sem_b.sem_flg = SEM_UNDO;  
  9.   
  10.     if(semop(sem_id,&sem_b,1) == -1)  
  11.     {  
  12.         fprintf(stderr,"semaphore_p failed\n");  
  13.         return 0;  
  14.     }  
  15.   
  16.     return 1;  
  17. }  
  18.   
  19. //函数:信号量V操作:对信号量进行加一操作  
  20. static int semaphore_v(void)  
  21. {  
  22.     struct sembuf sem_b;  
  23.   
  24.     sem_b.sem_num = 0;//信号量编号  
  25.     sem_b.sem_op = 1;//V操作    
  26.     sem_b.sem_flg = SEM_UNDO;  
  27.   
  28.     if(semop(sem_id,&sem_b,1) == -1)  
  29.     {  
  30.         fprintf(stderr,"semaphore_v failed\n");  
  31.         return 0;  
  32.     }  
  33.   
  34.     return 1;  
  35.   

你可能感兴趣的:(down, up, sem_p, sem_v, sem_wait, sem_post 的区别)