Linux系统编程--信号函数

230 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 23 天,点击查看活动详情

一、信号发出函数

  1. kill命令和kill函数

  2. alarm 函数:使用自然计时法

  3. setitimer函数

  4. int raise(int sig);

    void abort(void);

二、信号集操作函数

sigset_t set;  自定义信号集。

sigemptyset(sigset_t *set);	清空信号集

sigfillset(sigset_t *set);	全部置1

sigaddset(sigset_t *set, int signum);	将一个信号添加到集合中

sigdelset(sigset_t *set, int signum);	将一个信号从集合中移除

sigismember(const sigset_t *set,int signum); 判断一个信号是否在集合中。 在--》1, 不在--》0

信号集操作 image.png

三、设置信号屏蔽字和解除屏蔽

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

	how:	SIG_BLOCK:	设置阻塞

		SIG_UNBLOCK:	取消阻塞

		SIG_SETMASK:	用自定义set替换mask。

	set:	自定义set

	oldset:旧有的 mask。

四、查看未决信号集

int sigpending(sigset_t *set);

	set: 传出的 未决信号集。

阻塞信号集和未决信号集

image.png

五、信号捕捉

signal();

【sigaction();】 重点!!!

  • 信号捕捉特性:

    1. 捕捉函数执行期间,信号屏蔽字 由 mask --> sa_mask , 捕捉函数执行结束。 恢复回mask

    2. 捕捉函数执行期间,本信号自动被屏蔽(sa_flgs = 0).

    3. 捕捉函数执行期间,被屏蔽信号多次发送,解除屏蔽后只处理一次!

    借助信号完成 子进程回收。

六、守护进程

守护进程定义

daemon进程。通常运行于操作系统后台,脱离控制终端。一般不与用户直接交互。周期性的等待某个事件发生或周期性执行某一动作。

不受用户登录注销影响。通常采用以d结尾的命名方式。

守护进程创建步骤

  1. fork子进程,让父进程终止。

  2. 子进程调用 setsid() 创建新会话

  3. 通常根据需要,改变工作目录位置 chdir(), 防止目录被卸载。

  4. 通常根据需要,重设umask文件权限掩码,影响新文件的创建权限。 022 -- 755 0345 --- 432 r---wx-w- 422

  5. 通常根据需要,关闭/重定向 文件描述符

  6. 守护进程 业务逻辑。while()