Posix多线程编程学习笔记(三)—信号灯(1)

转载 2012年05月22日 10:35:13

Posix有名信号灯

       函数sem_open创建一个新的有名信号灯或打开一个已存在的有名信号灯。有名信号灯总是既可用于线程间的同步,又可以用于进程间的同步。

 

1.posix有名信号灯函数

1.

名称:

sem_open

功能:

创建并初始化有名信号灯

头文件:

#include <semaphore.h>

函数原形:

sem_t *sem_open(const char *name,int oflag,/*mode_t mode,unsigned int value*/);

参数:

name  信号灯的外部名字

oflag  选择创建或打开一个现有的信号灯

mode 权限位

value 信号灯初始值

返回值:

成功时返回指向信号灯的指针,出错时为SEM_FAILED

      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 oflag参数可以是0O_CREAT(创建一个信号灯)或O_CREAT|O_EXCL(如果没有指定的信号灯就创建),如果指定了O_CREAT,那么第三个和第四个参数是需要的;其中mode参数指定权限位,value参数指定信号灯的初始值,通常用来指定共享资源的书面。该初始不能超过SEM_VALUE_MAX,这个常值必须低于为32767。二值信号灯的初始值通常为1,计数信号灯的初始值则往往大于1

       如果指定了O_CREAT(而没有指定O_EXCL),那么只有所需的信号灯尚未存在时才初始化它。所需信号灯已存在条件下指定O_CREAT不是一个错误。该标志的意思仅仅是“如果所需信号灯尚未存在,那就创建并初始化它”。但是所需信号灯等已存在条件下指定O_CREAT|O_EXCL却是一个错误。

       sem_open返回指向sem_t信号灯的指针,该结构里记录着当前共享资源的数目。

 

/*semopen.c*/

#include <semaphore.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

 

int main(int argc,char **argv)

{

sem_t *sem;

 

if(argc!=2)

{

    printf(“please input a file name!/n”);

    exit(1);

}

sem=sem_open(argv[1],O_CREAT,0644,1);

exit(0);

}

#gcc –lpthread –o semopen semopen.c

#./semopen

 

2.

名称:

sem_close

功能:

关闭有名信号灯

头文件:

#include <semaphore.h>

函数原形:

int sem_close(sem_t *sem);

参数:

sem 指向信号灯的指针

返回值:

若成功则返回0,否则返回-1

     

 

 

 

 

 

 

 

 

 一个进程终止时,内核还对其上仍然打开着的所有有名信号灯自动执行这样的信号灯关闭操作。不论该进程是自愿终止的还是非自愿终止的,这种自动关闭都会发生。

       但应注意的是关闭一个信号灯并没有将它从系统中删除。这就是说,Posix有名信号灯至少是随内核持续的:即使当前没有进程打开着某个信号灯,它的值仍然保持。

 

3.

名称:

sem_unlink

功能:

从系统中删除信号灯

头文件:

#include <semaphore.h>

函数原形:

int sem_unlink(count char *name);

参数:

name  信号灯的外部名字

返回值:

若成功则返回0,否则返回-1

      

 

 

 

 

 

 

 

 

 

 有名信号灯使用sem_unlink从系统中删除。

每个信号灯有一个引用计数器记录当前的打开次数,sem_unlink必须等待这个数为0时才能把name所指的信号灯从文件系统中删除。也就是要等待最后一个sem_close发生。

 

/*semunlink.c*/

#include <semaphore.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

 

int main(int argc,char **argv)

{

sem_t *sem;

int val;

if(argc!=2)

{

    printf(“please input a file name!/n”);

    exit(1);

}

if((sem_unlink(argv[1]))!=0)

    perror(“sem_unlink”);

else

    printf(“success”);

exit(0);

}

 

4.

名称:

sem_getvalue

功能:

测试信号灯

头文件:

#include <semaphore.h>

函数原形:

int sem_getvalue(sem_t *sem,int *valp);

参数:

sem 指向信号灯的指针

返回值:

若成功则返回0,否则返回-1

 

 

 

 

 

 

 

 

 


sem_getvalue在由valp指向的正数中返回所指定信号灯的当前值。如果该信号灯当前已上锁,那么返回值或为0,或为某个负数,其绝对值就是等待该信号灯解锁的线程数。

 

/*semgetvalue.c*/

#include <semaphore.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

 

int main(int argc,char **argv)

{

sem_t *sem;

int val;

 

if(argc!=2)

{

    printf(“please input a file name!/n”);

    exit(1);

}

sem=sem_open(argv[1],0);

sem_getvalue(sem,&val);

printf(“getvalue:value=%d/n”,val);

exit(0);

}

 

相关文章推荐

Posix多线程编程学习笔记(三)—信号灯(3)

4.posix有名信号灯应用于多进程 下面就是应用Posix有名信号灯的一个小程序。用它来限制访问共享代码的进程数目。 #include #include #include...
  • elbort
  • elbort
  • 2012年05月22日 10:52
  • 690

Posix多线程编程学习笔记(三)—信号灯(2)

5. 名称:: sem_wait/sem_trywait 功能: 等待共享资源 头文件: #include ...

Posix多线程编程学习笔记(六)—共享内存(1)

一、什么是共享内存区 共享内存区是最快的可用IPC形式。它允许多个不相关的进程去访问同一部分逻辑内存。如果需要在两个运行中的进程之间传输数据,共享内存将是一种效率极高的解决方案。一旦这样的内存区映射...
  • elbort
  • elbort
  • 2012年05月22日 11:31
  • 317

Posix多线程编程学习笔记(一)—线程基础(1)

一.什么是线程       在一个程序里的多个执行路线就叫做线程。更准确的定义是:线程是“一个进程内部的一个控制序列”。        典型的unix进程可以看成只有一个控制线程:一个进程在同...

Posix多线程编程学习笔记(二)—线程属性(1)

一.线程属性        线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用pthread_attr_init函数对其初...

Posix多线程编程学习笔记(二)—线程属性(3)

六、线程的作用域        函数pthread_attr_setscope和pthread_attr_getscope分别用来设置和得到线程的作用域,这两个函数的定义如下:        ...
  • elbort
  • elbort
  • 2012年05月22日 10:33
  • 221

Posix多线程编程学习笔记(一)—线程基础(2)

6. 名称:: pthread_detach 功能: 使线程进入分离状态。 头文件: #include ...

Posix多线程编程学习笔记(四)—互斥量(2)

四、互斥锁属性        线程和线程的同步对象(互斥量,读写锁,条件变量)都具有属性。在修改属性前都需要对该结构进行初始化。使用后要把该结构回收。我们用pthread_ mutexattr_in...
  • elbort
  • elbort
  • 2012年05月22日 10:56
  • 230

Posix多线程编程学习笔记(二)—线程属性(2)

四、线程的调度策略        函数pthread_attr_setschedpolicy和pthread_attr_getschedpolicy分别用来设置和得到线程的调度策略。   4...

Posix多线程编程(3)—信号灯(量)

有名信号灯和基于内存的信号灯 信号灯---限制进程或线程访问共享资源的个数 一、Posix有名信号灯  函数sem_open创建一个新的有名信号灯或打开一个已存在的有名信号灯。有名信号灯总是...
  • ruglcc
  • ruglcc
  • 2012年08月17日 10:17
  • 414
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Posix多线程编程学习笔记(三)—信号灯(1)
举报原因:
原因补充:

(最多只允许输入30个字)