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("信号创建成功\n");
        while(1)
        {
        printf("获取信号量...\n");
        sem_wait(sem_ptr);  
        //sem_wait为阻塞方式,也就是如果没有获取到信号量会一直等待,直到有信号量为止。
        //成功返回0,失败设置error值
/*

//下面是非阻塞方式获取信号量,一旦获取不到资源,不会在那里干等着,会直接返回。
        if(sem_trywait(sem_ptr)==-1)
        {
            if(errno==EAGAIN) //因为没有等到信号资源的错误,error的值会被设置为EAGAIN
            {
                printf("资源被占用,信号量没有获取到\n");
            }
            else  //其他情况可能发生了致命错误
            {
             printf("获取资源发生错误\n");   
            }
        }

*/
        printf("信号量获取成功\n");
        //...
        sleep(3);    //#include<unistd.h>
        //...   
        printf("释放信号量\n");
        sem_post(sem_ptr);
        printf("信号量释放成功\n");
        sleep(1);
        }

    sem_close(sem_ptr);  //关闭信号量
    sem_unlink("/mysem");//删除已经创建好的信号量文件


    return 0;
}

 

posted @ 2020-10-17 20:01  sunshine_gzw  阅读(109)  评论(0编辑  收藏  举报