精华内容
下载资源
问答
  • 2020-09-15 00:00:04

    两个函数原型如下:

    有名信号初始化:

    sem_t *sem sem_open(const char *name, int oflag, .../*mode_t mode,unsinged int value) ;

    内存信号量初始化:
    int sem_init(sem_t *sem,int shared, unsigned int value);

    区别:
    1.创建有名信号量必须指定一个与信号量相关链的文件名称,这个name通常是文件系统中的某个文件。
      基于内存的信号量不需要指定名称
    2.有名信号量sem 是由sem_open分配内存并初始化成value值
      基于内存的信号量是由应用程序分配内存,有sem_init初始化成为value值。如果shared为1,则分配的信号量应该在共享内存中。
    3.sem_open不需要类似shared的参数,因为有名信号量总是可以在不同进程间共享的
      而基于内存的信号量通过shared参数来决定是进程内还是进程间共享,并且必须指定相应的内存
    4.基于内存的信号量不使用任何类似于O_CREAT标志的东西,也就是说,sem_init总是初始化信号量的值,因此,对于一个给定的信号量,我们必须小心保证只调用sem_init一次,对于一个已经初始化过的信号量调用sem_init,结果是未定义的。
    5.内存信号量通过sem_destroy删除信号量,有名信号量通过sem_unlink删除

    更多相关内容
  • 在编译Linux设备驱动程序学习(1)-字符设备驱动程序中scull.c程序时,报错:/linux-2.6.35/mytest/scull/scull/scull.c: 在函数‘scull_init_module’中:/linux-2.6.35/mytest/scull/scull/...

    转自:http://blog.chinaunix.net/uid-7332782-id-3211627.html

    在编译
    Linux设备驱动程序学习(1)-字符设备驱动程序
    中scull.c程序时,报错:
    /linux-2.6.35/mytest/scull/scull/scull.c: 在函数‘scull_init_module’中:
    /linux-2.6.35/mytest/scull/scull/scull.c:305:3: 错误:隐式声明函数‘init_MUTEX’
    搜索得到结果如下:

        2.6.25及以后的linux内核版本废除了init_MUTEX函数

        新版本使用sema_init函数

    平台:X86 32位
    内核:2.6.24
    定义
    : 

    点击(此处)折叠或打开

    1. static inline void init_MUTEX (struct semaphore *sem) 
    2.         sema_init(sem, 1); 
    3. }

    说明:Init_MUTEX()函数初始化信号量为互斥量。 互斥量为信号量的特例,它可以防止数据被两个不同系统调用读写。 

    sema_init (sem, 1) 定义为:

    点击(此处)折叠或打开

    1. static inline void sema_init (struct semaphore *sem, int val)
    2. {
    3. /*
    4. * *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val);
    5. *
    6. * i'd rather use the more flexible initialization above, but sadly
    7. * GCC 2.7.2.3 emits a bogus warning. EGCS doesn't. Oh well.
    8. */
    9.     atomic_set(&sem->count, val);
    10.     sem->sleepers = 0;
    11.     init_waitqueue_head(&sem->wait);
    12. }

    sleepers : 指定了允许进入等待进入临界区的进程数,这里初始化为 0 。
    init_waitqueue_head() : 初始化一个等待队列头。

    这样不难得出,废除 init_MUTEX 后,将原来使用 init_MUTEX(sem)的地方统统替换为sema_init(sem, 1); 即可

    展开全文
  • init_MUTEX 替换为 sema_init(sem,1)

    千次阅读 2014-11-07 18:00:00
    2.6.25及以后的linux内核版本废除了init_MUTEX函数 新版本使用sema_init函数   平台:X86 32位 内核:2.6.24 定义:  引用 static inline void init_MUTEX (struct semaphore *sem)  {  ...

    2.6.25及以后的linux内核版本废除了init_MUTEX函数

    新版本使用sema_init函数

     

    平台:X86 32位
    内核:2.6.24
    定义
    : 

    引用
    static   inline   void   init_MUTEX  ( struct   semaphore   * sem)  
    {  
             sema_init( sem ,   1);  
    }



    说明:Init_MUTEX()函数初始化信号量为互斥量。 互斥量为信号量的特例,它可以防止数据被两个不同系统调用读写。 

    sema_init (sem, 1) 定义为:

    引用

    static inline void sema_init (struct semaphore *sem, int val)
    {
    /*
    *    *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val);
    *
    * i'd rather use the more flexible initialization above, but sadly
    * GCC 2.7.2.3 emits a bogus warning. EGCS doesn't. Oh well.
    */
        atomic_set(&sem->count, val);
        sem->sleepers = 0;
        init_waitqueue_head(&sem->wait);
    }


    sleepers : 指定了允许进入等待进入临界区的进程数,这里初始化为 0 。
    init_waitqueue_head() : 初始化一个等待队列头。

     

    这样不难得出

    废除init_MUTEX

    将原来使用init_MUTEX(sem)的地方统统替换为sema_init(sem,1); 即可


    转自:http://blog.csdn.net/ustcxjt/article/details/6916493

    展开全文
  • Linux sem_init函数用法

    2021-08-27 01:09:41
    sem_init函数是Posix信号量操作中的函数。 int sem_init(sem_t *sem,int pshared,unsigned int value); sem_init() 初始化一个定位在 sem 的匿名信号量。value 参数指定信号量的初始值。 pshared 参数指明信号量...

    sem_init函数是Posix信号量操作中的函数。

    int sem_init(sem_t *sem,int pshared,unsigned int value); 

    sem_init() 初始化一个定位在 sem 的匿名信号量。value 参数指定信号量的初始值。 pshared 参数指明信号量是由进程内线程共享,还是由进程之间共享。

    如果 pshared 的值为 0,那么信号量将被进程内的线程共享,并且应该放置在这个进程的所有线程都可见的地址上(如全局变量,或者堆上动态分配的变量)。

    如果 pshared 是非零值,那么信号量将在进程之间共享,并且应该定位共享内存区域(见 shm_open(3)、mmap(2) 和 shmget(2))。因为通过 fork(2) 创建的孩子继承其父亲的内存映射,因此它也可以见到这个信号量。所有可以访问共享内存区域的进程都可以用 sem_post(3)、sem_wait(3) 等等操作信号量。初始化一个已经初始的信号量其结果未定义。

    返回值:sem_init() 成功时返回 0;错误时,返回 -1,并把 errno 设置为合适的值。

    一个例子:

    比如有两个线程都要往打印机上打东西,但是同一时刻只能打一个。那么首先用sem_init初始化一个信号量,注意pshared表示允许几个进程共享该信号量,一般设0用于进程内的多线程共享,要看是否支持进程共享,请查看下你的系统的man手册。

    展开全文
  • pthread_mutex_init () 初始化 一把互斥锁后 :mutex = 1 ,代表有一把互斥锁可用。 pthread_mutex_lock (), 加锁 :mutex = 0 ,只有拥有锁的线程(个数=1)可以访问共享数据。 pthread_mutex_unlock (),解锁 :...
  • #define init_MUTEX_LOCKED(sem) sema_init(sem, 0)//将信号量count初始化为0 static inline void sema_init(struct semaphore *sem, int val) { static struct lock_class_key __key; *sem = (struct semaphore) _...
  • 函数sem_init()用来初始化一个信号量。它的原型为:  extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));  sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间...
  • lockdep_init_map(&sem->lock.dep_map, "semaphore->lock", &__key, 0); } 初始化了信号量中的 spinlock 结构,count 计数器和初始化链表。   3. 可中断获取信号量函数down_interruptible static ...
  • init_MUTEX(&flashlight_private.sem); */ sema_init( &flashlight_private.sem, 1 ); flashlight_gpio_init(dev); logI( " [flashlight_probe] Done ~ " ); return 0 ; flashlight_probe_error: #...
  • linux 线程同步(二)

    2021-05-26 04:51:26
    0表示不在多进程间 共享,非0表示在多进程之间共享详细能够man sem_init //成功返回0,出错返回-1 int sem_init(sem_t *sem, int pshared, unsigned int value); int sem_wait(sem_t *sem)//相当于p操作 int sem_...
  • #define init_MUTEX(sem)sema_init(sem, 1) #define init_MUTEX_LOCKED(sem)sema_init(sem, 0) 使用init_MUTEX(sem)初始化信号量时,表示信号量最初是可以被获取的。而使用init_MUTEX_LOCKED(sem)初始化信号量时,...
  • sem_init函数 该函数用于创建信号量,其原型如下: int sem_init(sem_t *sem,int pshared,unsigned int value); 该函数初始化由sem指向的信号对象,设置它的共享选项,并给它一个初始的整数值。 pshared控制信号量...
  • = 0,信号量在进程间共享 * value:信号量的初始值 *return: * 成功:0 * 失败:-1 */ int sem_init(sem_t *sem, int pshared, unsigned int value); 信号量 P 操作 #include /* *功能: * 将信号量的值减 1,若...
  • init_MUTEX(sem) sema_init(sem, 1) #define init_MUTEX_LOCKED(sem) sema_init(sem, 0) extern void down( struct semaphore * sem); extern int __must_check down_interruptible( struct semaphore...
  • 信号量(semaphore) //只有得到信号量的进程才能执行临界区代码; //当获取不到信号量时,进程不会原地打转而是进入休眠等待状态。...void init_MUTEX(struct semaphore *sem);== sema_init (struct semaphore *se
  • 学习信号量 sem_init、sem_destroy、sem_post、sem_wait、sem_trywait、sem_getvalue 概要: 1.信号量使用场合 2.POSIX标准定义的信号量 2.1 sem_init、sem_destroy、sem_post、sem_wait、sem_trywait、sem_getvalue...
  • Linux驱动_信号量

    2022-03-27 21:04:00
    /* 初始化信号量 */ sema_init(&gpioled.sem, 1); //初始化信号量为1 gpioled.major = 0; /*linux内核自动申请设备号*/ /*注册字符设备驱动*/ if(gpioled.major){ /*给定主设备号*/ gpioled.devid = MKDEV(gpioled....
  • 可睡眠锁Mutex(互斥量)一次只能被一个对象所持有类似用户空间的glibc中的pthread_mutex_lock持有mutex后任然可以睡眠(可以被调度出去)使用#include初始化:编译时初始化:DEFINE_MUTE()运行时初始化:mutex_init()...
  • 信号量 (Semaphore)

    2019-07-03 17:20:32
    信号量是一种很典型的用于同步和互斥的方法,信号量是是经典的PV操作,通常用于生产者/消费者问题。 P:减1操作,如果执行P之后sem任然大于0则该进程继续执行,否则进入等待状态。...void sema_init(struct semaph...
  • sema api

    2015-11-05 10:51:29
     lockdep_init_map(&sem->lock.dep_map, "semaphore->lock", &__key, 0); }  #define __SEMAPHORE_INITIALIZER(name, n) / { /  .lock = __SPIN_LOCK_UNLOCKED((name).lock), / //初始化自旋锁  ....
  • #define init_MUTEX(sem) sema_init(sem, 1) 该宏用于初始化一个用于互斥的信号量,它把信号量 sem 的值设置为 1; #define init_MUTEX_LOCKED(sem) sema_init(sem, 0) 该宏也用于初始化一个信号量,但它把信号量...
  • linux内核中信号量

    2021-05-14 04:02:20
    //初始化设置信号量,并且设置其初始值为val init_MUTEX(sem); //初始化一个互斥锁,将其值设定为1 init_MUTEX_LOCKED(sem); //此函数初始化一个互斥锁sem,初始值设为0,即在创建时就处在已锁状态。 使用down(sem)...
  •  lockdep_init_map(&sem->lock.dep_map, "semaphore->lock", &__key, 0); } #define __SEMAPHORE_INITIALIZER(name, n) / { /  .lock = __SPIN_LOCK_UNLOCKED((name).lock), / //初始化自旋锁  .count = n, / //...
  • void sema_init(sema_t *sema,int value) { sema->value = value; pthread_mutex_init(&sema->mutex,NULL); pthread_cond_init(&sema->cond,NULL); } void sema_wait(sema_t *sema) { pthread_mutex_lock(&sema...
  • init_MUTEX(sem) sema_init(sem, 1) 其中sem为struct semaphore结构体变量,所以,在应用此宏来初始化一个信号前,必须定义一个struct semaphore结构体变量。此宏初始化一个名为sem的信号量,并把其...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,810
精华内容 1,524
关键字:

sema_init