linux有关信号的FAQ
1、为什么会出现系统调用被中断的情况?
进程在执行一个低速系统调用而阻塞期间捕捉到一个信号时,该系统调用就被中断不再继续执行。该系统调用返回出错,其errno被设置为EINTR。这样处理的理由是:因为一个信号发生了,进程捕捉到了它,这意味着已经发生了某种事情,所以是个唤醒阻塞的系统调用的好机会。
2、不可重入函数的原因?
(a)它们使用静态的数据结构;(b)调用malloc或free;(c)它们是标准IO函数。
3、在对某个信号解除阻塞之前,如果这个信号发生了多次,那就如何处理?
UNIX只递送这种信号一次,其它信号不进行排队,只被简单的丢弃。
4、一个进程能发送信号给哪些进程?
如果这个进程拥有超级用户权限,这可以发给任何进程;如果这个进程是普通用户进程,则发送者的实际或者有效用户ID必须等于接收者的实际或有效用户ID。有一个特例是,如果被发送的信号是SIGCONT,则进程可将它发送给属于同一会话的任何其他进程。
5、信号传递有两个阶段?
一个是信号产生:内核更新目标进程的数据结构以表示一个新信号已被发送;另一个是信号传递:内核强迫目标进程通过以下方式对信号做出反应:或改变目标进程的指向状态,或开始执行一个特定的信号处理程序,或者两者都是。已经产生但还没有传递的信号称为挂起信号。
6、信号处理函数是否必须是可重入的?
当信号执行一个信号处理程序的函数时,通常“屏蔽”相应的信号,即自动阻塞这个信号直到处理程序结束。因此,所处理的信号的另一次出现不能中断信号处理程序,所以,信号处理函数不必是可重入的。
7、信号处理程序在多线程中是怎样调用的?
每个线程都有自己的挂起信号掩码(哪些信号正等待被传递)和阻塞信号掩码(哪些信号被阻塞)。只能给多线程应用发信号,而不能给单个线程发信号。每个发生给多线程应用的信号仅传送给一个线程,这个线程是由内核从不阻塞该信号的线程中随意选择出来的。如果向多线程应用发生了一个致命的信号,那么内核将杀死该应用的所有线程,而不仅仅是杀死接收信号的那个线程。
8、一个信号处理程序可以打断另一个信号处理程序的执行吗?
可以的,只要这两个信号处理程序不是同一个就行。apue中讲解alarm和pause函数中举了一个例子,在该例子中SIGINT的处理程序就被SIGALRM处理程序中断了。
9、执行完某个信号的处理程序后,该信号的处理会不会恢复为系统默认的动作?
不会,只有早期版本的系统会,现在的不会了。
10、struct signal中的sa_handle和sa_sigaciton字段的关系?
struct signal结构中的sa_handler和sa_sigaction字段可能使用同一存储区,所以应用程序只能一次使用这两个字段中的一个。通常我们使用的是第一个字段,如果设置了SA_SIGINFO标志,则是使用sa_sigaction字段。
11、调用sigaction函数时设置的信号屏蔽集是在信号处理函数运行时直接设置为进程的信号屏蔽集还是并入进程的信号屏蔽集?
在调用处理函数之前将信号屏蔽集并入进程的信号屏蔽集,函数退出后再恢复进程先前的信号屏蔽集。
12、我们知道在调用信号处理程序之前会将当前处理的信号加入到信号屏蔽集中,如果在信号处理程序中使用longjmp跳出信号处理程序,那么信号屏蔽集是否会恢复到调用信号处理程序之前的状态?
POSIX.1并没有对此说明,不过我们可以使用函数sigsetjmp和siglongjmp来显示解决这个问题。如果在调用sigsetjmp时传递的savemask参数不为0,则sigsetjmp在env中保存进程的当前信号屏蔽集。调用siglongjmp时,如果带非0 savemask的sigsetjmp调用已经保存了env,则siglongjmp从其中恢复保存的信号屏蔽集。
13、哪些信号是不能被捕获或忽略的?
SIGKILL和SIGSTOP是不能被捕获或忽略的。
14、abort的作用是什么?
发送SIGABRT信号给进程(进程不应该忽略此或阻塞该信号),abort确保进程被终止前对所有打开标准I/O流进行冲洗和关闭,除非进程自己捕获了SIGABRT处理函数,并且调用_exit让进程终止。
15、kill使其为调用者产生信号,是不是kill返回前对应的信号就传送给了该进程?
不一定,首先要保证该信号不被阻塞,其次保证该进程没有其它未决未阻塞的信号。如果kill产生的信号是不被阻塞的,则kill返回前该信号(或某个未决、未阻塞的信号)就被传送给了该进程。
16、system对信号是怎么处理的?
system会忽略SIGINT和SIGQUIT,阻塞SIGCHLD。忽略SIGINT和SIGQUIT这两个信号是保证调用system产生的子进程捕获这两个信号,而调用system的进程则不应该捕获这两个信号。阻塞SIGCHLD保证我们能正确的获得system产生的子进程的终止状态。
17、fork系统调用后子进程会继承信号屏蔽掩码,信号处理函数吗?
会的,不过未处理的信号集会设置为空集。
18、waitpid函数什么情况下会返回?
如果该函数等待的进程或进程组状态改变了就会返回,如进程终止了(不管子进程是否发生SIGCHLD信号给父进程),或者该函数等待的进程或进程组不存在了,则会出错返回。
19、一个停止的进程接到SIGCONT信号时,会怎样?
当对一个停止的进程产生一个SIGCONT信号时,该进程就继续运行,即使该信号是被阻塞或忽略的也是如此。
20、linux下的作业控制命令有哪些?
fg、bg、jobs、&、ctrl + z都是跟作业有关的命令。& 最经常被用到,这个用在一个命令的最后,可以把这个命令放到后台执行;ctrl + z,可以将一个正在前台执行的命令放到后台,并且暂停;jobs,查看当前有多少在后台运行的命令;fg,将后台中的命令调至前台继续运行,如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid);bg,将一个在后台暂停的命令,变成继续执行,如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)。
linux有关信号的FAQ的更多相关文章
- linux kill信号列表
linux kill信号列表 $ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) ...
- Linux进程间通信——信号集函数
一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...
- linux 自定义信号
从来没试过linux自定义信号,查了下,说是系统只提供了SIGUSR1和SIGUSR2两个,就两个够吗?更要命的是如果要自定义信号如#define SIG_MYSIG ....的话要改内核才行,哥 ...
- Linux 的信号和线程
什么是线程 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成,每一个程序都至少 ...
- Linux之信号
产生信号五种方法: 按键产生:ctrl+c.ctrl+z.ctrl+\ 系统调用产生:如kill.raise.baort 软件条件产生:如定时器alarm 硬件异常产生:非法访问内存(段错误).除0( ...
- Linux&C ——信号以及信号处理
linux信号的简单介绍 信号的捕捉和处理 信号处理函数的返回 信号的发送 信号的屏蔽 一:linux信号的简单介绍. 信号提供给我们一种异步处理事件的方法,由于进程之间彼此的地址空间是独立的,所以进 ...
- Linux&C ——信号以及信号处理
linux信号的简单介绍 信号的捕捉和处理 信号处理函数的返回 信号的发送 信号的屏蔽 一:linux信号的简单介绍. 信号提供给我们一种异步处理事件的方法,由于进程之间彼此的地址空间是独立的,所以进 ...
- Linux 发送信号
使用kill命令 --在命令行执行kill命令.向指定进程发送信号. 使用kill函数 int kill(pid_t pid,int sig); --参数pid指定一个要杀死的进程,而sig是要发送的 ...
- Linux进程间通信-信号
1.什么是信号信号是Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会执行相应的操作. 2.信号的产生1)由硬件产生,如从键盘输入Ctrl+C可以终止当前进程2)由其他进程发送,如可在s ...
随机推荐
- Flume_常见的几个问题
在HDFS的文件默认生成文件大小1K,如何设置文件大小和数量 拷贝一份flume-conf.properties.template改名为hive-mem-size.properties hive-me ...
- 利用DOS批处理实现定时关机操作
10月1放假回来,寝室晚上10:30就停电了,最无法让人理解的是第二天早上8:00才来电.原来晚上电脑都是不关机的,开着WiFi一直到天亮,可是现在不行了,电脑如果一直开着第二天早上起来电脑肯定没电, ...
- C#上位机制作之串口接受数据(利用接受事件)
前面设计好了界面,现在就开始写代码了,首先定义一个串口对象.. SerialPort serialport = new SerialPort();//定义串口对象 添加串口扫描函数,扫描出来所有可用串 ...
- C#中的委托与事件并存的理由
更多资源:http://denghejun.github.io 问题 有了委托为什么还要有事件? 理论上,事件能完成的事情委托完全可以胜任,但是我们思考的这一方面是功能性,我们必须从他们各自的特点分析 ...
- SQLPrompt 7.2发布
SQLPrompt 7.2发布 下载地址:http://www.red-gate.com/products/sql-development/sql-prompt/ 红门的热门产品SQLPrompt 发 ...
- Android安全开发之通用签名风险
Android安全开发之通用签名风险 作者:伊樵.舟海.呆狐@阿里聚安全 1 通用签名风险简介 1.1 Android应用签名机制 阿里聚安全漏洞扫描器有一项检测服务是检测APP的通用签名风险.And ...
- php杂记(一)
1.require_once & require include() 函数会将指定的档案读入并且执行里面的程序 include_once() 与include相同,但只允许一次: requir ...
- 使用 nvm 管理不同版本的 node 与 npm
补充说明:Mac 下通过 brew install nvm 所安装的 nvm ,由于安装路径不同,无法正确启用.建议使用 brew uninstall nvm 卸载掉之后,通过本文的方案重新安装一次. ...
- 使用Guava EventBus构建publish/subscribe系统
Google的Guava类库提供了EventBus,用于提供一套组件内publish/subscribe的解决方案.事件总线EventBus,用于管理事件的注册和分发.在系统中,Subscribers ...
- ARM汇编指令调试方法
学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...