您的位置:首页 > 运维架构 > Linux

Linux——POSIX有名信号量

2016-03-30 14:21 393 查看

有名信号量

作用:主要用于同步线程或进程

头文件:#include <semaphore.h>

创建或打开信号量

/**

       输入:const char* name                      信号名

                   int oflag                                       标志(O_CREAT、O_CREAT|O_EXCL)

                   mode_t mode                            访问权限

                   int value                                      初始化值

       输出:sem_t*                                       有名信号的标识符  

       说明:创建并初始化一个有名信号量 或 打开一个已经创建的有名信号量

                   当oflag=O_CREAT     若有名信号量未创建,则创建,后面参数不能忽略必须写;

                                                          若信号量存在,则打开,后面的参数可以忽略

                   当oflag=O_CREAT|O_EXCL   若信号量已经存在,则输出error

*/

sem_t  *sem_open(const char* name, int oflag, mode_t mode, int value);

关闭信号量的引用

/**

       输入:sem_t* semid  

       输出:int      

                   0——关闭成功     

                   -1——关闭失败

       说明:对有名信号量的引用进行关闭

*/

int  sem_close(sem_t  *semid);

删除系统中的信号量

/**

       输入: const char* name   有名信号量名

       输出: int  

                    0——删除成功     

                   -1——删除失败

       说明: 删除系统中的有名信号量

*/

int  sem_close(const char* name);

信号量的PV操作

/**

       输入:sem_t   semid   有名信号量标识符

       说明: 若信号量的值为0,则此此线程或进程进入wait状态

                    若信号量的值为1,则信号量的值减1,然后继续运行此进程与线程

*/
sem_wait(sem_t *  semid);

/**

       输入: sem_t   semid   有名信号量标识符

       说明: 信号量的值加1操作

*/
sem_post(sem_t* semid);

注意:

信号量都是创建在/dev/shm下,如创建mysem,则在/dev/shm/下创建sem.mysem文件。有名信号量位于共享内存区中,那么它所保护的资源也必须位于共享内存区,

因此它可以与shmget与shmat结合使用。

简单实例:

#include <semaphore.h>

#inlcude <stdlib.h>

#include <stdio.h>

#include <sys/types.h>

#include <fcntl.h>

sem_t *semid;

int main(int argc, char** argv)

{

     const char* semName = "sem_name_run";

     semid = sem_open(semName,O_CREAT,0644,0);

     if(semid == SEM_FAILED)

    {

            perror("unable to create semaphore");

            unlink(semName);

            exit(-1);

    }

     if(fork() == 0)

     {

             for(int i=0; i<10; ++i)

            {

                        printf("childe process run: %d\n",i);

            }

            sem_post(semid);

     }

      sem_wait(semid);

      for(int i=0; i<10; ++i)

      {

             printf("parent process run: %d\n",i);

       }

      sem_close(semid);

      sem_unlink(semName);

       return 0;

}

简单实例主要实现主进程与子进程之间实现同步功能,先阻塞主进程,当子进程运行完,在运行主进程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: