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(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

原型:

#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

原型:

#include <unistd.h>
int pause(void);
                      Returns:?1 with errno set to EINTR

pause能够使进程休眠。直到发生一个信号。

时间: 2024-10-26 18:46:46

APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause的相关文章

APUE学习笔记——10.可靠信号与不可靠信号

首先说明:现在大部分Unix系系统如Linux都已经实现可靠信号. 1~31信号与SIGRTMIN-SIGRTMAX之间并不是可靠信号与不可靠信号的区别,在大多数系统下他们都是可靠信号. 只不过: 1~31信号                              --不支持排队,为普通信号. SIGRTMIN-SIGRTMAX信号 --支持排队,实时信号 不可靠信号 什么是不可靠信号: 不可靠的意思是信号可能丢失或者被错误处理. 在早起系统中,信号存在两大缺陷,导致了信号不可靠. 缺陷一:

APUE学习笔记——10信号——信号接口函数 signal 和 sigaction

signal函数 signal函数是早起Unix系统的信号接口,早期系统中提供不可靠的信号机制.在后来的分支中,部分系统使用原来的不可靠机制定有signal函数,如 Solaris 10 .而更多的系统采用新语义 可靠信号机制,如4.4BSD. 出于signal函数不同系统的不统一性,我们一般使用sigaction函数取代它.关于sigaction函数,我们在本文后面做详细介绍. 函数原型: #include <signal.h> void (*signal(int signo,void (*

APUE学习笔记——10 信号(一)——信号介绍

信号的基本概念 信号是软件中断,信号提供了解决异步时间的方法. 每一中信号都有一个名字,信号名以SIG开头. 产生信号的几种方式 很多条件可以产生信号: 终端交互:用户按下某一些按键,如ctl+c,会产生信号. 硬件异常:如除数为0,内存引用错误.    kill(2)函数:将信号发送到一个进程或者进程组   kill(1)命令:该命令为kill(2)函数的接口.用于终止失控的后台in成.  检测到某软件条件发生:如网络连接上传来外数据(产生SIGURG信号),闹钟超时(产生SIGALRM信号)

APUE学习笔记——10.11~10.13 信号集、信号屏蔽字、未决信号

如有转载,请注明出处:Windeal专栏 首先简述下几个概念的关系: 我们通过信号集建立信号屏蔽字,使得信号发生阻塞,被阻塞的信号即未决信号. 信号集: 信号集:其实就是一系列的信号.用sigset_t set表示. 数据类型:sigset_t 类似于整型(位数可能超过整型,因而不能用整型表示). 我们一般在sigprocmask()等函数中使用信号集,用于创建一系列进程要阻塞的信号,告诉内核不允许这些信号发生. 几个关于信号集的函数: #include <signal.h> int sige

APUE学习笔记——10.18 system函数 与waitpid

system函数 system函数用方便在一个进程中执行命令行(一行shell命令). 用法如下: #include <stdio.h> #include <stdlib.h> int main() { printf("Hello\n"); system("sleep 5"); return 0; } 在程序中通过system调用了命令行 sleep 5.(这里知识举一个例子,当然可以执行一个类似" bash test.sh&quo

APUE学习笔记——10.15 sigsetjmp和siglongjmp

转载自:sigsetjmp使用方法 如侵犯您的权益,请联系:[email protected] sigsetjmp使用方法 分类: c/c++ linux2012-02-03 12:33 1252人阅读 评论(0) 收藏 举报 signal 相关函数:longjmp, siglongjmp, setjmp 表头文件:#include <setjmp.h> 函数定义:int sigsetjmp(sigjmp_buf env, int savesigs) 函数说明:sigsetjmp()会保存眼下

APUE学习笔记——3.10文件共享

基本概念 内核使用3个数据结构描述一个打开的文件:进程表.文件表.V节点表 首先了解3种数据结构的概念 1 进程表 每一个进程有一个进程表.进程表里是一组打开的文件描述符,如标准输入0,标准输出1,标准错误2... 2 文件表 进程打开一个文件时,内核就为该文件创建一个文件表. 进程表对文件表是 一对多的关系    文件表对文件描述符也是一对多的关系(可能多个文件描述符指向同一文件表) 文件表中包含了文件状态标志.当前偏移量.和V-node pointer表项 文件状态标志如:read,  wr

MySQL学习笔记10(MySQL函数)

MySQL学习笔记10 MySQL函数 MySQL数据库中提供了很丰富的函数.MySQL函数包括数学函数.字符串函数.日期和时间函数.条件判断函数.系统信息函数.加密函数.格式化函数等.通过这些函数,可以简化用户的操作.SELECT语句及其条件表达式都可以使用这些函数.同时,INSERT.UPDATE.DELECT语句及其条件表达式也可以使用这些函数. 1:数学函数 数学函数是M有SQL中常用的一类函数.主要用于处理数字,包括整型.浮点数等.数学函数包括绝对值函数.正弦函数.余弦函数.获取随机数

APUE学习笔记:第九章 进程关系

9.1 引言 本章将更详尽地说明进程组以及POSIX.1引入的会话的概念.还将介绍登陆shell(登录时所调用的)和所有从登陆shell启动的进程之间的关系. 9.1 终端登陆 系统管理员创建通常名为/etc/ttys的文件,其中每个终端设备都有一行,每一行说明设备名传递给getty程序的参数.当系统自举时,内核创建进程ID为1的进程,依旧是init进程.init进程使系统进入多用户状态.init进程读文件/etc/ttys,对每一个允许登陆的终端设备,init调用一次fork,所生成的子进程则