10.9 kill以及raise函数

kill函数用于发送信号给一个进程或者是一个进程组,函数raise允许进程发送一个信号给自身。

raise函数最开始定义与ISO C中,POSIX.1为了与兼容ISO C标准,于是包含了函数raise,但是POSIX.1将函数raise的特性扩展到了线程处理(我们将在12.8中讨论线程是如何与信号发生交互的),因为ISO C并不处理多进程,它并不能定义向kill这样的函数,因为kill函数需要使用一个进程ID的参数。

  1. #include <signal.h>
  2. int kill(pid_t pid, int signo);
  3. int raise(int signo);
  4. Both return: 0 if OK,-1 on error.
  5. The call
  6. raise(signo);
  7. is equilent to the call:
  8. kill(getpid(), signo);

对于kill的参数pid,有四种不同的条件:

pid条件 含义
pid>0 信号被发送到进程ID为pid的进程
pid == 0 信号被发送到所有进程组ID与发送进程的进程组ID一致的进程,注意属于”所有进程”包含了实现定义的系统进程集合,对于许多UNIX系统,这个系统进程集合包含了内核进程以及init(pid 1).
pid < 0 信号被发送到所有进程组ID等于pid绝对值且调用该函数的进程有权限发送信号的进程,同样的,所有进程的集合包含了某些系统进程,正如前面描述的那样
pid == -1 信号被发送到系统上所有调用该函数的进程有权限的所有进程,正如前文所述,该集合包含了某些系统进程。

超级用户可以发送信号到任意进程,对于其他的用户而言,基本规则是:发送进程的real or effective user id必须等于接收进程的real or effective user ID,如果实现支持_POSIX_SAVED_IDS(POSIX.1要求支持),那么就会检查接收进程的saved set-user-id而不是其effective user ID,对于上述权限检查的一个特例是:如果发送的信号是SIGCONT,那么任意处于相同会话的所有进程都可以接收它。

POSIX.1定义了信号编号0为null信号,如果signo参数传递的是0,然后正常的错误检查将被kill函数执行,但是并不会发送任何信号,该技术通常用于检查特定进程是否仍然存在,如果我们发给一个进程null信号,而接受进程已经不存在了,那么kill函数将会返回-1,同时errno将被设置为ESRCH,需要注意的是:UNIX系统会循环利用进程ID,所以一个相同进程ID的进程的出现并不一定意味着还是原来的进程.

如果kill函数的调用造成一个信号生成,并且发送的目标进程是调用进程自身,同时信号是不被阻塞的,那么未阻塞的信号就会在kill函数返回之前被发送到进程。

来自为知笔记(Wiz)

时间: 2024-10-10 18:30:25

10.9 kill以及raise函数的相关文章

1.信号处理之:kill(),alarm(),pause()函数

 1查看信号的方式:man 7 signal,通过这个命令可以查看到所有信息. 2查看信号kill -l 注意,后面的32个信号表示的实时信号. 会发现一个规律,前32种信号会有各种不同的名称,后32种会以"SIGRTMIN"或者"SIGRTMAX"开头,前者是从unix继承下来的信号,称为不可靠信号(也称为非实时信号),后者为了解决"不可靠信号"的问题进行了更改和扩充的信号形成了可靠信号(也称为实时信号) 如果想要了解可靠与不可靠信号,需要

信号的发送kill,raise,alarm,setitimer,abort,sigqueue

1.kill函数 2.raise函数 3.sigqueue函数 4.alarm函数 5.getitimer/setitimer函数 6.abort函数

10.6 可重入函数

当一个信号捕获到并开始被进程处理的时候,进程正常执行的指令序列将被信号处理函数临时中断,进程立即转到信号处理函数中开始执行,如果信号处理函数返回(而不是调用exit或者是longjmp等),然后在进入信号处理函数之前进程正在执行的指令序列将会接着执行,但是在信号处理函数中,我们无法获知在信号被捕获的时候进程正在执行那一段代码,如果进程正在使用函数malloc在其堆上分配额外的内存的过程中会发生什么呢?或者是进程正在调用一个函数的过程中,比如说getpwnam将会发生什么呢?函数getpwnam会

APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int kill(pid_t pid,int signo); int raise(int signo); Both return: 0 if OK,?1 on error kill向进程号为pid的进程发送signo信号 能够看出 以下两行代码是等价的: kill(getpid(), signo); raise(sig

10.15 sigstjmp以及siglongjmp函数

在7.10节中,我们讲述了setjmp以及longjmp函数,这两个函数用于远程跳转.其中longjmp函数进场在信号处理函数中被调用,用于返回到进程的主循环中去,而不是从信号处理函数中返回. 但是使用函数longjmp有一个问题,当一个信号被捕获的时候,信号处理函数被执行,当前信号将被自动增加到进程的信号掩码中去.这样做的目的是为了防止后续的信号中断当前信号处理函数的执行,如果我们调用longjmp函数退出信号处理函数,信号掩码将会发生什么呢? 在FreeBSD 8.0以及Mac OS X 1

10.2.3.1 以函数方式使用数组

我们先来看一个 F# 的例子,这是两个F# 库处理数组的重要的高阶函数,然后,用 C# 实现相同的功能.清单 10.12 的中脚本,先用随机数初始化一个数组,然后,计算出它们的平方. 清单 10.12 处理数组的函数式方法(F# Interactive) > let rnd = new System.Random();; val rnd : System.Random > let numbers = Array.init 5 (fun _-> rnd.Next(10));;   [1]

2进制,8进制,16进制转10进制的自定义函数

1.2进制转10进制自定义函数: function DecToInt(temp:string):integer; //2进制转10进制var  i,j  : Integer;begin  result := 0;  j   := Length(temp);  //取得字符串长度:  for I := 0 to Length(temp)-1 do  begin    result := result+strtoint(Copy(temp,j,1))*Trunc(power(2,I));  //Tr

Python基础(10)_内置函数、匿名函数、递归

一.内置函数 1.数学运算类 abs:求数值的绝对值 divmod:返回两个数值的商和余数,可用于计算页面数 >>> divmod(5,2) (2, 1) max:返回可迭代对象中的元素中的最大值或者所有参数的最大值 语法:max(iterable,key,default) 1 salaries={ 2 'egon':3000, 3 'alex':100000000, 4 'wupeiqi':10000, 5 'yuanhao':2000 6 } 7 8 print(max(salari

10.迭代器/生成器/协程函数/列表生成器

迭代器为什么要用迭代器?小结:生成器为什么要使用生成器,什么是生成器?如何创建一个生成器举个栗子:斐波拉契数列用yield返回结果的执行流程作业代码以及注释:协程函数面向过程编程作业以及代码注解:典型范例以及代码解析:列表生成式生成器表达式作业和练习 迭代器 为什么要用迭代器? 提供了一种不依赖索引的取值方式,使一些不具有索引属性的对象也能遍历输出 相比列表,迭代器的惰性计算更加节约内存. 但是它无法有针对性地指定取某个值,并且只能向后取值. >>> from collections i