• Linux IPC POSIX 信号量


    模型

    #include<semaphore.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    sem_open()        //初始化并打开有名信号量
    sem_init()        //创建/获得无名信号量
    sem_wait()/sem_trywait()/sem_timedwait()/sem_post()/sem_getvalue()    //操作信号量
    sem_close()       //退出有名信号量
    sem_unlink()      //销毁有名信号量
    sem_destroy()     //销毁无名信号量
    

    sem_open()

    //创建/打开一个有名信号量,成功返回新信号量的地址,失败返回SEM_FAILED设errno
    // <semaphore.h>
    //#define SEM_FAILED	((sem_t *) 0
    //#define SEM_VALUE_MAX 	(2147483647)
    //Link with -pthread.
    sem_t *sem_open(const char *name, int oflag);
    sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
    

    oflag

    • O_CREAT如果信号量不存在就创建信号量,信号量的UID被设为调用进程的effective UID,GID被设为调用程序的GID,可以在mode指定权限
    • O_EXCL和O_CREAT连用,确保可以创建新的信号量,如果已存在就报错

    value :配合O_CREAT使用,设置信号量的初始值

    sem_init()

    //初始化无名信号量,成功返回0,失败返回-1设errno
    //Link with -pthread.
    int sem_init(sem_t *sem, int pshared, unsigned int value);
    

    sem 创建无名信号量的指针
    pthread指定信号量是在线程间使用还是进程间使用

    • 0表示信号量在一个进程内的线程间使用,此时信号量应该分配的在线程可见的内存区域(eg,全局区,BSS段,堆区)
    • 非0表示信号量在进程间使用,此时信号量应该分配在共享内存里,If pshared !=0,

    sem_wait()/sem_trywait()/sem_timedwait()

    //Link with -pthread.
    //成功返回降低后的信号量的值,失败返回-1设errno
    //试图占用信号量,如果信号量值>0,就-1,如果已经=0,就block,直到>0
    int sem_wait(sem_t *sem);
    
    //试图占用信号量,如果信号量已经=0,立即报错
    int sem_trywait(sem_t *sem);
    
    //试图占用信号量
    //如果信号量=0,就block abs_timeout那么久,从 Epoch, 1970-01-01 00:00:00 +0000 (UTC).开始按纳秒计
    //如果时间到了信号量还没>0,报错
    int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
    
    struct timespec {
        time_t 	tv_sec;      /* Seconds */
        long   	tv_nsec;     /* Nanoseconds [0 .. 999999999] */
    };
    

    sem_post()

    //归还信号量,成功返回0,失败返回-1设errno
    //Link with -pthread.
    int sem_post(sem_t *sem);
    

    sem_getvalue()

    //获得信号量sem的当前的值,放到sval中。如果有线程正在block这个信号量,sval可能返回两个值,0或“-正在block的线程的数目”,Linux返回0
    //成功返回0,失败返回-1设errno
    //Link with -pthread.
    int sem_getvalue(sem_t *sem, int *sval);
    

    sem_close()

    //关闭有名信号量,成功返回0,失败返回-1设errno
    //Link with -pthread.
    int sem_close(sem_t *sem);
    
    //试图销毁信号量,一旦所有占用该信号量的进程都关闭了该信号量,那么就会销毁这个信号量
    //成功返回0,失败返回-1设errno
    //Link with -pthread.
    int sem_unlink(const char *name);
    

    sem_destroy()

    //销毁信号量,成功返回0,失败返回-1设errno
    //Link with -pthread.
    int sem_destroy(sem_t *sem);
    
  • 相关阅读:
    【转载】python Excel处理openpyxl
    微信登陆——Unity游戏接入广告Android篇01
    SVG Video 声音图标灰色,无法点击
    electron Nodejs 打开文件中文乱码
    mysql 基于GTID复制
    日常问题及其解决方案
    Proj THUDBFuzz Paper Reading: Probe the Proto: Measuring ClientSide Prototype Pollution Vulnerabilities of One Million Realworld
    Proj FuzzViz Paper Reading: Feedbackdirected Random Test Generation
    Proj THUDBFuzz Paper Reading: Cefuzz: An Directed Fuzzing Framework for PHP RCE Vulnerability
    使用函数作为参数 传递数据,封装阿里 easyexcel 导出大数据量 excel
  • 原文地址:https://www.cnblogs.com/xiaojiang1025/p/5937746.html
Copyright © 2020-2023  润新知