zoukankan      html  css  js  c++  java
  • POXSIX之信号量

    #include<stdio.h>
    #include<semaphore.h>
    #include<fcntl.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<errno.h>
    void p_error(const char* str)
    {
        perror(str);
        exit(1);   //exit包含在头文件stdlib.h中,exit(0)表示正常退出,非0表示非正常退出.
    }
    
    int main(int argc,char* argv[])
    {
        sem_t* sem_ptr=sem_open("/mysem",O_CREAT,0666,1); //#include<fcntl.h>
     //第一个参数为创建信号量的名字,为了跨平台性,最好加上/,也就是/mysem,创建好的信号量(不管是否指定路径),都会默认保存在/dev/shm中
     //最后一个参数为信号量的值,也就是最多创建多少个信号量,当信号量达到上限时,进程就会争夺信号量资源
    
            //成功返回信号量的指针,下面是失败判断
            if(sem_ptr==SEM_FAILED)
            {
              p_error("创建信号失败");
            }
            printf("信号创建成功
    ");
            while(1)
            {
            printf("获取信号量...
    ");
            sem_wait(sem_ptr);  
            //sem_wait为阻塞方式,也就是如果没有获取到信号量会一直等待,直到有信号量为止。
            //成功返回0,失败设置error值
    /*
    
    //下面是非阻塞方式获取信号量,一旦获取不到资源,不会在那里干等着,会直接返回。
            if(sem_trywait(sem_ptr)==-1)
            {
                if(errno==EAGAIN) //因为没有等到信号资源的错误,error的值会被设置为EAGAIN
                {
                    printf("资源被占用,信号量没有获取到
    ");
                }
                else  //其他情况可能发生了致命错误
                {
                 printf("获取资源发生错误
    ");   
                }
            }
    
    */
            printf("信号量获取成功
    ");
            //...
            sleep(3);    //#include<unistd.h>
            //...   
            printf("释放信号量
    ");
            sem_post(sem_ptr);
            printf("信号量释放成功
    ");
            sleep(1);
            }
    
        sem_close(sem_ptr);  //关闭信号量
        sem_unlink("/mysem");//删除已经创建好的信号量文件
    
    
        return 0;
    }
  • 相关阅读:
    CF238B Boring Partition
    CF1424G Years
    CF995D Game
    CF468C Hack it!
    CF1417A Copy-paste
    CF1417B Two Arrays
    CF849B Tell Your World
    [洛谷P3389][模板]高斯消元法
    CF1225D
    P6687
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/13832354.html
Copyright © 2011-2022 走看看