linux程序设计——进程和信号总结(第十一章)

58 篇文章 0 订阅
57 篇文章 9 订阅
11.4.2    信号集
头文件signal.h定义了类型sigset_t和用来处理信号集的函数.sigaction和其他函数.sigaction和其他函数将用这些信号集来修改进程在接收到信号时的行为.
#include <signal.h>

int sigaddset(sigset_t *set, int signo);
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigdelset(sigset_t *set, int signo);
这些函数执行的操作如它们的名字所示,sigemptyset将信号集初始化为空.sigfillset将信号集初始化为包含所有已定义的信号.sigaddset和sigdelset从信号集中增加或删除给定的信号(signo).它们在成功时返回0,失败时返回-1并设置errno.
函数sigismember判断一个给定的信号是否是一个信号集的成员.如果是就返回1;如果不是就返回0;给定信号无效就返回-1并设置errno为EINVAL.
#include <signal.h>
int sigismember(sigset_t *set, int signo);
进程的信号屏蔽字的设置或检查工作由函数sigprocmask来完成.信号屏蔽字是指当前被阻塞的一组信号,它们不能被当前进程接收到.
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
sigprocmask函数可以根据参数how指定的方法修改进程的信号屏蔽字,新的信号屏蔽字由参数set指定,而原先的信号屏蔽字将保存在信号集oset中.
常用信号参考
下表中信号的默认动作都是异常终止进程,进程将以_exit调用方式退出(它类似exit,但在返回到内核之前不作任何清理工作).但进程的结束状态会传递到wait和waitpid函数中,从而表明进程是因某个特定的信号而异常终止的.
信号名称                  说明
SIGALRM                由alarm函数设置的定时器产生
SIGHU                     由一个处于非连接状态的终端发送给控制进程
SIGINT                     一般由从终端输入的Ctrl+C组合键或预先设置好的中断字符产生
SIGKILL                   因为这个信号不能被捕获,一般在shell中用它来强制终止异常进程
SIGPIPE                   如果在向管道写数据时没有与之对应的读进程,就会产生这个信号
SIGTERM                作为一个请求被发送,要求进程结束运行
SIGUSR1,SIGUSR2        进程之间可以用这个信号进行通信,例如让进程报告状态信息等

11.5    小结

本章中,知道了进程是如何成为linux系统的一个基本组成部分的.学习了如何启动进程,终止进程和查看进程,如何用它们来解决程序设计问题.还介绍了信号这种可以用来控制程序运行行为的事件.还了解了所有的linux进程,包括init在内,都使用这同样的系统调用,每个程序员都可以也用它们来开发自己的程序.
1.进程是如何成为linux系统的一个基本组成部分?
进程是"一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源".每个运行着的程序实例就构成了一个进程.
正在运行的程序或进程由程序代码,数据,变量(占用着系统内存),打开的文件(文件描述符)和环境组成.
每个进程都被分配一个唯一的数字编号--进程标识符或PID
.
2.如何启动进程,终止进程和查看进程?
使用ps命令查看运行的进程(-a选项查看所有的进程,-f显示进程的完整信息)
使用system(const char* string)(例如system("ps ax"))在程序的内部启动另一个程序,从而创建一个新进程.
使用system函数启动进程的缺点是,它必须用一个shell来启动所需要的进程(必须安装shell)
使用exec系列函数把当前进程替换为一个新进程(原来的程序就不再运行)
调用fork创建一个新的进程,这个系统调用复制当前进程,在进程表中创建一个新的表项,新进程几乎与原进程相同,但新进程有自己的数据空间,环境和文件描述符.子进程的fork调用返回的是0,通过这点可以判断出谁是父进程,谁是子进程.
调用wait函数让父进程等待子进程的结束,调用waitpid函数等待某个特定的进程的结束
.
3.信号
信号是linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动.信号是由于某些错误条件产生的,如内存段冲突,浮点处理器或非法指令等,它们由shell和终端处理器生成来引起中断,它们还可以作为在进程间传递消息或修改行为的一种方式,明确地由一个进程发送给另一个进程.
可以使用signal函数处理信号

void (*signal(int sig, void(*func)(int)))(int);
signal是一个指针函数
signal有两个参数:int和某某指针,某某指针是一个函数指针,指向一个参数为int,返回值为void的函数
signal的返回值是:指针,这个指针是一个函数指针,指向一个参数为int,返回值为void的函数
sig给出准备捕获或忽略的信号,func给出接收到指定的信号后将要调用的函数
健壮的信号接口使用sigaction(不使用signal),它的定义如下:
int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);
sigaction是一个结构,至少包括以下几个成员:
void (*) (int) sa_handler    /* sa_handler是一个函数指针,它指向接收到信号sig时将要被调用的信号处理函数 */
sigset_t sa_mask                 /* sa_mask成员指定了一个信号集 */
int sa_flags                          /* signal action modifiers */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值