Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26791
  • 博文数量: 6
  • 博客积分: 105
  • 博客等级: 民兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-28 10:07
文章分类
文章存档

2015年(2)

2012年(1)

2011年(3)

我的朋友

分类: LINUX

2011-06-10 11:14:37

信号量常见操作:
1.在进程中屏蔽指定信号量:每个进程都有自己的信号阻塞集合,把要进行屏蔽的信号量加入该集合,进程捕捉到该信号时将不进行处理,有两个信号不能忽略:SIGKILL及SIGSTOP
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
how:用于指定信号修改的方式,可能选择有三种

SIG_BLOCK //加入信号到进程屏蔽。
SIG_UNBLOCK //从进程屏蔽里将信号删除。
SIG_SETMASK //将set的值设定为新的进程屏蔽。
 
  1. sigset_t newmask,oldmask;
  2. sigemptyset(newmask);//初始话信号量集
  3. sigaddset(&newmask,SIGQUIT);//把SIGQUIT加入到信号量集
  4. //newmask置为当前进程的信号阻塞集合,并把标记保存在oldmask中
  5. sigprocmask(SIG_BLOCK,&newmask,&oldmask);
  6. //恢复被屏蔽的信号量
  7. sigprocmask(SIG_SETMASK,null,oldmask);
2.信号的发送
发送信号的主要函数有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。

1、kill()

  1. #include <sys/types.h>

  2. #include <signal.h>

  3. int kill(pid_t pid,int signo)

2、raise()

  1. #include <signal.h>
  2. int raise(int signo)


向进程本身发送信号,参数为即将发送的信号值。调用成功返回 0;否则,返回 -1。

3.信号的安装,设置信号关联动作

1.signal

 

  1. #include <signal.h>

  2. void (*signal(int signum, void (*handler))(int)))(int);

 

如果该函数原型不容易理解的话,可以参考下面的分解方式来理解:

  1. typedef void (*sighandler_t)(int)

  2. sighandler_t signal(int signum, sighandler_t handler));

第一个参数指定信号的值,第二个参数指定针对前面信号值的处理,可以忽略该信号(参数设为SIG_IGN);可以采用系统默认方式处理信号(参数设为SIG_DFL);也可以自己实现处理方式(参数指定一个函数地址)。

如果signal()调用成功,返回最后一次为安装信号signum而调用signal()时的handler值;失败则返回SIG_ERR。

2、sigaction()

  1. #include <signal.h>

  2. int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact));

sigaction函数用于改变进程接收到特定信号后的行为。该函数的第一个参数为信号的值,可以为除SIGKILL及SIGSTOP外的任何一个特定有效的信号(为这两个信号定义自己的处理函数,将导致信号安装错误)。第二个参数是指向结构sigaction的一个实例的指针,在结构sigaction的实例中,指定了对特定信号的处理,可以为空,进程会以缺省方式对信号处理;第三个参数oldact指向的对象用来保存原来对相应信号的处理,可指定oldact为NULL。如果把第二、第三个参数都设为NULL,那么该函数可用于检查信号的有效性。

第二个参数最为重要,其中包含了对指定信号的处理、信号所传递的信息、信号处理函数执行过程中应屏蔽掉哪些函数等等。

2.利用信号实现线程同步

a.在线程中设置等待的信号

 

  1. #ifndef __TCTHREAD__
  2. #define __TCTHREAD__
  3. #include <pthread.h>
  4. #include <signal.h>
  5. class TCThread
  6. {
  7.     public:
  8.         // @brief 构造函数
  9.         TCThread();

  10.         // @brief 析构函数
  11.         ~TCThread();
  12.     // @brief 启动线程
  13.         bool Start();
  14.         // @brief 线程停止
  15.         void pause();

  16.         // @brief 线程继续运行
  17.         void continues();

  18.     private:
  19.         // @brief 屏蔽SIGUSR1信号
  20.         void maskSIGUSR1();

  21.         // @brief 信号量集合
  22.         sigset_t g_waitSig;

  23.    
  24.     protected:
  25.      //由子类实现具体任务逻辑
  26.         virtual void Run() = 0;

  27. };

  28. #endif
  1. TCThread::TCThread()
  2. {
  3.     maskSIGUSR1();

  4.     // 定义SIGUSR1信号阻塞
  5.     sigemptyset(&tcwaitSig);
  6.     sigaddset(&tcwaitSig, SIGUSR1);
  7. }

  8. TCThread::~TCThread()
  9. {
  10. }

  11. void TCThread::maskSIGUSR1()
  12. {
  13.     sigset_t sig;
  14.     sigemptyset(&sig);//清空信号量集合
  15.     sigaddset(&sig , SIGUSR1);//把SIGUSR1加入到信号量集合中
  16.     pthread_sigmask(SITCBLOCK , &sig , NULL); //在线程中屏蔽sig信号量结合中的信号
  17. }

  18. bool TCThread::Start()
  19. {
  20.     int nRet = pthread_create(&tcpid , NULL , threadFun , this);
  21.     if(0 == nRet)
  22.     {
  23.         nRet = pthread_detach(g_pid);//线程退出时释放线程资源
  24.         if(nRet == 0)
  25.         {
  26.             return true;
  27.         }
  28.     }
  29.     else
  30.     {
  31.         return false;
  32.     }

  33.     return true;
  34. }
  35. void G_Thread::pause()
  36. {
  37.     int sig;
  38.     sigwait(&g_waitSig , &sig);//等待SIGUSR1信号
  39. }

  40. void G_Thread::continues()
  41. {
  42.     pthread_kill(g_pid , SIGUSR1);//向线程发送SIGUSR1信号
  43. }
 
 
 
阅读(904) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:线程基本概念

给主人留下些什么吧!~~