您的位置:首页 > 产品设计 > UI/UE

APUE——信号发送函数kill,raise,pause,alarm

2015-05-18 20:52 253 查看

kil和raise

kill()用来向进程或进程组发送信号

raise()用来向自身进程发送信号。

[cpp] view
plaincopy

#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信号

可以看出 下面两行代码是等价的:

[cpp] view
plaincopy

kill(getpid(), signo);

raise(signo);

对于kill函数,其参数pid有四种不同情况:

pid > 0 表示向进程号为pid的进程发送信号。

pid==0 将信号发送给同一进程组 且发送进程具有向其发送信号权限 的所有进程(“所有进程”包括系统实现定义的系统进程集)

pid < 0 将信号发送给进程组id为pid绝对值 且发送进程具有向其发送信号权限
的进程(“所有进程”包括系统实现定义的系统进程集)

pid == -1 将信号发送给 发送进程具有发送信号权限的 所有进程(“所有进程”包括系统实现定义的系统进程集)

上面提到发送权限, 发送进程具有发送信号的权限指的是,发送进程的RUID或者EUID 等于 接收进程的RUID或者EUID

signo为0

kill(pid,0);执行错误测试,但不发送信号。

也就是说,kill(pid,0);可以用来测试进程号为pid的进程是否存在。

如果进程不存在,kill()返回-1 ,且errno被置为ESRCH


alarm

原型:

[cpp] view
plaincopy

#include <unistd.h>

unsigned int alarm(unsigned int seconds);

<span style="white-space:pre"> </span>Returns: 0 or number of seconds until previously set alarm

指定seconds秒后产生SIGALARM信号,在不忽略、不捕获SIGALARM时,系统默认动作为终止调用该定时器的进程。

每个进程只有一个闹钟。

所以在调用alarm时,如果进程已有闹钟,且还为超时——将剩余时间作为alarm()函数返回值,用新时间seconds替代旧时间;

进一步,如果如果进程已有闹钟,且还为超时而本次alarm的seconds参数为0,则取消以前的闹钟,并将剩余时间作为返回值。


pause

原型:

[cpp] view
plaincopy

#include <unistd.h>

int pause(void);

Returns:−1 with errno set to EINTR

pause可以使进程休眠,直到发生一个信号。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐