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的更多相关文章

  1. linux kill信号列表

    linux kill信号列表 $ kill -l1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL5) SIGTRAP      6) ...

  2. Linux进程间通信——信号集函数

    一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...

  3. linux 自定义信号

    从来没试过linux自定义信号,查了下,说是系统只提供了SIGUSR1和SIGUSR2两个,就两个够吗?更要命的是如果要自定义信号如#define SIG_MYSIG   ....的话要改内核才行,哥 ...

  4. Linux 的信号和线程

    什么是线程 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成,每一个程序都至少 ...

  5. Linux之信号

    产生信号五种方法: 按键产生:ctrl+c.ctrl+z.ctrl+\ 系统调用产生:如kill.raise.baort 软件条件产生:如定时器alarm 硬件异常产生:非法访问内存(段错误).除0( ...

  6. Linux&C ——信号以及信号处理

    linux信号的简单介绍 信号的捕捉和处理 信号处理函数的返回 信号的发送 信号的屏蔽 一:linux信号的简单介绍. 信号提供给我们一种异步处理事件的方法,由于进程之间彼此的地址空间是独立的,所以进 ...

  7. Linux&C ——信号以及信号处理

    linux信号的简单介绍 信号的捕捉和处理 信号处理函数的返回 信号的发送 信号的屏蔽 一:linux信号的简单介绍. 信号提供给我们一种异步处理事件的方法,由于进程之间彼此的地址空间是独立的,所以进 ...

  8. Linux 发送信号

    使用kill命令 --在命令行执行kill命令.向指定进程发送信号. 使用kill函数 int kill(pid_t pid,int sig); --参数pid指定一个要杀死的进程,而sig是要发送的 ...

  9. Linux进程间通信-信号

    1.什么是信号信号是Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会执行相应的操作. 2.信号的产生1)由硬件产生,如从键盘输入Ctrl+C可以终止当前进程2)由其他进程发送,如可在s ...

随机推荐

  1. UbuntuでPostgreSQLをインストールからリモートアクセスまでの手順

    PostgreSQLサーバの立ち上げに少しハマりましたので.メモしておきます. OS: Ubuntu14.04 LTS インストール 最初はPostgreSQLをインストールします.普通にapt-ge ...

  2. css中关于居中的问题

    居中是最常用的一种css格式,不同的居中方法适和不同的环境中,下面总结了几种常用的居中方法,你可以不用它,但是无论你是一个资深前端大牛,还是小小初学者,当你见到它的时候不认识它就是你的不对啦!!! h ...

  3. mongoose 和 mongoDB

    第三方学习地址:http://blog.csdn.net/foruok/article/details/47746057 下载mongoDB https://www.mongodb.com/downl ...

  4. Mysql常用表操作 | 单表查询

    160905 常用表操作 1. mysql -u root -p 回车 输入密码   2. 显示数据库列表 show databases     3. 进入某数据库 use database data ...

  5. LINUX 下时间转换为秒数

    linux下时间是从1970.1.1开始算的秒数 //转来自网址 http://blog.csdn.net/wind19/article/details/6579495 $ dateTue Feb 3 ...

  6. MySQL 数据库事务与复制

    好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适. 最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类. 结合实际工作中碰到的问题,以寻找答案的方式 ...

  7. CentOS 7 安装RabbitMQ 3.3

    1.安装erlang 语言环境 安装依赖文件 #yum install ncurses-devel 进入 http://www.erlang.org/download.html 选择源文件下载 wge ...

  8. PHP是怎么运行的

    这篇文章,研究一下PHP代码是如何解释和执行以及PHP脚本运行的生命周期. 概述 PHP服务的启动.严格来说,PHP的相关进程是不需要手动启动的,它是随着Apache的启动而运行的.当然,如果有需要重 ...

  9. Windows建立Cucumber和Ruby测试环境

    1. 下载安装Ruby1.9.3, 不要用RubyInstall 一键安装,下载zip然后解压到c:\Ruby193 (不要用2.0,用2.0安装不成功,不要怪我) 2. 环境变量配置RUBY_HOM ...

  10. ASP.NET MVC 5 入门指南汇总

    经过前一段时间的翻译和编辑,我们陆续发出12篇ASP.NET MVC 5的入门文章.其中大部分翻译自ASP.NET MVC 5 官方教程,由于本系列文章言简意赅,篇幅适中,从一个web网站示例开始讲解 ...