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; }