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