转载--sigprocmask阻塞进程

作者:muge0913

链接:linux c sigprocmask阻塞进程

1、有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。这种情况是通过阻塞信号实现的。

2、信号阻塞和忽略信号的区别。

阻塞的概念和忽略信号是不同的。操作系统在信号被进程解除阻塞之前不会讲信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递。当进程忽略一个信号时,信号会被传递出去但进程会将信号丢弃。

3、信号阻塞系统调用,它们的都起到阻塞的作用,它们不是协作使用的。

[cpp] view plaincopyprint?

  1. #include <signal.h>
  2. int sigprocmask(ubt how,const sigset_t*set,sigset_t *oldset);
  3. int sigsuspend(const sigset_t*sigmask);

sigprocmask设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞)。

参数:

how:用于指定信号修改的方式,可能选择有三种

SIG_BLOCK//将set所指向的信号集中包含的信号加到当前的信号掩码中。即信号掩码和set信号集进行或操作。

SIG_UNBLOCK//将set所指向的信号集中包含的信号从当前的信号掩码中删除。即信号掩码和set进行与操作。

SIG_SETMASK //将set的值设定为新的进程信号掩码。即set对信号掩码进行了赋值操作。

set:为指向信号集的指针,在此专指新设的信号集,如果仅想读取现在的屏蔽值,可将其置为NULL。

oldset:也是指向信号集的指针,在此存放原来的信号集。可用来检测信号掩码中存在什么信号。

返回说明:

成功执行时,返回0。失败返回-1,errno被设为EINVAL。

sigprocmask示例(演示添加信号掩码):

[cpp] view plaincopyprint?

  1. #include <stdio.h>
  2. #include <signal.h>
  3. void checkset();
  4. void main()
  5. {
  6. sigset_tblockset;
  7. sigemptyset(&blockset);
  8. sigaddset(&blockset,SIGINT);
  9. sigaddset(&blockset,SIGTSTP);
  10. checkset();
  11. sigprocmask(SIG_SETMASK,&blockset,NULL);
  12. checkset();
  13. sigaddset(&blockset,SIGTERM);
  14. sigprocmask(SIG_BLOCK,&blockset,NULL);
  15. checkset();
  16. sigdelset(&blockset,SIGTERM);
  17. sigprocmask(SIG_UNBLOCK,&blockset,NULL);
  18. checkset();
  19. }
  20. void checkset()
  21. {
  22. sigset_tset set;
  23. printf("checksetstart:\n");
  24. if(sigprocmask(0,NULL,&set)<0)
  25. {
  26. printf("checksetsigprocmask error!!\n");
  27. exit(0);
  28. }
  29. if(sigismember(&set,SIGINT))
  30. printf("sigint\n");
  31. if(sigismember(&set,SIGTSTP))
  32. printf("sigtstp\n");
  33. if(sigismember(&set,SIGTERM))
  34. printf("sigterm\n");
  35. printf("checksetend\n");
  36. }

sigprocmask示例(演示添某部分代码不被信号打搅):

[cpp] view plaincopyprint?

    1. #include <stdio.h>
    2. #include <signal.h>
    3. void checkset();
    4. void func();
    5. void main()
    6. {
    7. sigset_tblockset,oldblockset,pendmask;
    8. printf("pid:%ld\n",(long)getpid());
    9. signal(SIGINT,func); //信号量捕捉函数,捕捉到SIGINT,跳转到函数指针func处执行
    10. sigemptyset(&blockset); //初始化信号量集
    11. sigaddset(&blockset,SIGTSTP); //将SIGTSTP添加到信号量集中
    12. sigaddset(&blockset,SIGINT);//将SIGINT添加到信号量集中
    13. sigprocmask(SIG_SETMASK,&blockset,&oldblockset); //将blockset中的SIGINT,SIGTSTP阻塞掉,并保存当前信号屏蔽字
    14. /*执行以下程序时,不会被信号打搅*/
    15. checkset();
    16. sleep(5);
    17. sigpending(&pendmask); //检查信号是悬而未决的
    18. if(sigismember(&pendmask,SIGINT)) //SIGINT是悬而未决的。所谓悬而未决,是指SIGQUIT被阻塞还没有被处理
    19. printf("SIGINTpending\n");
    20. /*免打搅结束*/
    21. sigprocmask(SIG_SETMASK,&oldblockset,NULL); //恢复被屏蔽的信号SIGINT SIGTSTP
    22. printf("SIGINTunblocked\n");
    23. sleep(6);
    24. }
    25. void checkset()
    26. {
    27. sigset_tset;
    28. printf("checksetstart:\n");
    29. if(sigprocmask(0,NULL,&set)<0)
    30. {
    31. printf("checksetsigprocmask error!!\n");
    32. exit(0);
    33. }
    34. if(sigismember(&set,SIGINT))
    35. printf("sigint\n");
    36. if(sigismember(&set,SIGTSTP))
    37. printf("sigtstp\n");
    38. if(sigismember(&set,SIGTERM))
    39. printf("sigterm\n");
    40. printf("checksetend\n");
    41. }
    42. void func()
    43. {
    44. printf("hellofunc\n");
    45. }
时间: 2024-10-02 23:33:40

转载--sigprocmask阻塞进程的相关文章

sql阻塞进程查询

select A.SPID as 被阻塞进程,a.CMD AS 正在执行的操作,b.spid AS 阻塞进程号,b.cmd AS 阻塞进程正在执行的操作 from master..sysprocesses a,master..sysprocesses b where a.blocked<>0 and a.blocked= b.spid exec sp_who 'active'--查看系统内所有的活动进程 BLK不为0的为死锁 exec sp_lock 60 --返回某个进程对资源的锁定情况 S

sqlserver 查询当前阻塞进程 并杀掉

select * from master.dbo.sysprocesses where DB_NAME(dbid)='test' and spid<>@@SPID 看看阻塞的进程 然后kill掉就行了 exec('kill ' [email protected]) 由于我是远程连接的数据库,杀死进程总会有顾虑.所以我就关闭了客户端,然后重启了之后就可以了. select显示我有两个进程一直处于runnable的状态 显示的是在执行SELECT

【转载】说说进程与线程的区别与联系

要了解二者的区别与联系,首先得对进程与线程有一个宏观上的了解. 进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位.每一个进程都有一个自己的地址空间,即进程空间或(虚空间).进程空间的大小 只与处理机的位数有关,一个 16 位长处理机的进程空间大小为 216 ,而 32 位处理机的进程空间大小为 232 .进程至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态. 线程,在网络或多用户环境下,一个服务器通常需要接收大量

阻塞进程函数 wait()和waitpid()

1.  wait()和waitpid()函数说明 wait() 进程一旦调用了wait(), 就立即阻塞自己,由wait自动分析是否有当前进程的某个子进程已经退出,如果让它找到了一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回:如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到一个子进程结束或者该进程接到了一个指定的信号为止. waitpid() waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一

35 并行/发 同/异步 非/ 阻塞 进程的两种开启方式, 进程的常用方法及属性

主要内容: 1  名词解释 并行 :  即两件事情或多件事情,在同一时间点同时执行.是从微观上,也就是在一个精确的时间片刻,有不同的程序在执行,这就要求必须有多个处理器 并发 :  即两件事情或多件事情在同一时间段交替进行. 是从宏观上,在一个时间段上可以看出是同时执行的,比如一个服务器同时处理多个session. 同步 :  所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列.要么成功都成功,失败都失败,两个任务的状态可以

[转载] 理解linux进程

原文: http://tobegit3hub1.gitbooks.io/understanding-linux-processes/content/index.html linux进程在我们上操作系统课程的时候老师就讲过了, 但是当时觉得是那么抽象不可理解. 随着对计算机技术理解的不断深入, 对进程的理解也越来越多了. 不过技术总是飞速的发展着, 特别是cgroup和namespace技术, 对linux进程的理解又多了一分神秘. 本文以非常简短的方式介绍了linux进程的方方面面, 虽然都没有

【转载】linux进程控制-exec系列 exec系统调用

inux进程控制-exec系列 说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是: #include <unistd.h>int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(const char *path, const char *arg, ...,

[转载]管理Redis进程的Shell脚本

下面是一个Shell脚本,用于管理Redis进程(启动,停止,重启),这个脚本可供参考. #!/bin/sh # # redis - this script starts and stops the redis-server daemon # # chkconfig:   - 85 15 # description:  Redis is a persistent key-value database # processname: redis-server # config:      /usr/

Linux C编程学习5---参考《那年,一步一步学linux c》全系列(目录索引)

漫无目的的搜索一些东西,发现的一个很好的资源,所以就一定要收藏下来,方便自己学习Linux C 的时候也能够去参考一下别人的学习之路,来更加促进我的学习和思考 说明 转载请注明出处:谢谢:http://blog.csdn.net/muge0913/article/details/7342977 博主的邮箱是:[email protected] 文章中若有不对或某些功能更好的实现方法,请指出或直接留言. 该系列文章中所用结构数据代码均来自linux2.6.39. 1.那年,一步一步学linux c