{
sem_t*sem; intval; if(argc!=2) {
printf(“please inputa file name!\\n”); exit(1); }
if((sem_unlink(argv[1]))!=0) perror(“sem_unlink”); else
printf(“success”); exit(0); }
4.
sem_getvalue 名称:: 功能: 测试信号灯 头文件: #include
sem_getvalue在由valp指向的正数中返回所指定信号灯的当前值。如果该信 号灯当前已上锁,那么返回值或为0,或为某个负数,其绝对值就是等待该信 号灯解锁的线程数。
/*semgetvalue.c*/ #include
intmain(intargc,char**argv) {
sem_t*sem; intval;
if(argc!=2) {
printf(“please inputa file name!\\n”);
exit(1);
}
sem=sem_open(argv[1],0); sem_getvalue(sem,&val);
printf(“getvalue:value=%d\\n”,val); exit(0); }
5.
sem_wait/sem_trywait 名称:: 功能: 等待共享资源 头文件: #include
下面的程序我们先不去运行,稍后再运行。 /*semwait.c*/ #include
intmain(intargc,char**argv) {
sem_t*sem; intval;
if(argc!=2) {
printf(“please inputa file name!\\n”); exit(1); }
sem=sem_open(argv[1],0); sem_wait(sem);
sem_getvalue(sem,&val);
printf(“pid %ld has semaphore,value=%d\\n”,(long)getpid(),val); pause(); exit(0); }
6.
sem_post 名称:: 功能: 挂出共享资源 头文件: #include
当一个线程使用完某个信号灯时,它应该调用sem_post来告诉系统申请的 资源已经用完。本函数和sem_wait函数的功能正好相反,它把所指定的信号灯 的值加1,然后唤醒正在等待该信号灯值变为正数的任意线程。
下面的程序我们先不去运行,稍后再运行。 /*sempost.c*/ #include
intmain(intargc,char**argv) {
sem_t*sem; intval;
if(argc!=2) {
printf(“please inputa file name!\\n”); exit(1); }
sem=sem_open(argv[1],0); sem_post(sem);
sem_getvalue(sem,&val); printf(“value=%d\\n”,val); exit(0);
}
二、关于posix有名信号灯使用的几点注意 我们要注意以下几点:
1.Posix有名信号灯的值是随内核持续的。也就是说,一个进程创建了一个信号 灯,这个进程结束后,这个信号灯还存在,并且信号灯的值也不会改变。 下面我们利用上面的几个程序来证明这点 #./semopentest #./semgetvaluetest
value=1 信号的值仍然是1
2。当持有某个信号灯锁的进程没有释放它就终止时,内核并不给该信号灯解锁。 #./semopentest #./semwaittest&
pid 1834 has semaphore,value=0 #./semgetvaluetest
value=0 信号量的值变为0了
三、posix有名信号灯应用于多线程 #include
void *thread_function(void *arg);/*线程入口函数*/ void print(pid_t);/*共享资源函数*/ sem_t*sem;/*定义Posix有名信号灯*/ intval; /*定义信号灯当前值*/
intmain(intargc,char*argv[]) {
intn=0;
if(argc!=2) {
printf(“please inputa filename!\\n”); exit(1); }
sem=sem_open(argv[1],O_CREAT,0644,3);/*打开一个信号灯*/
相关推荐: