linux信号Signal信号

信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。

信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。

软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。

收 到信号的进程对各种信号有不同的处理方法。

处理方法可以分为三类:

  1. 第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处 理。
  2. 第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。
  3. 第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信 号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。

在进程表的表项中有一个软中断信号域,该域中每一位对应一个信号,当有信号发送给进程时,对应位置位。由此可以看出,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个。

发出信号的原因很多,这里按发出信号的原因简单分类,以了解各种信号:

  1. 与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号。
  2. 与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。
  3. 与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。
  4. 与执行系统调用时遇到非预测错误条件相关的信号。如执行一个并不存在的系统调用。
  5. 在用户态下的进程发出的信号。如进程调用系统调用kill向其他进程发送信号。
  6. 与终端交互相关的信号。如用户关闭一个终端,或按下break键等情况。
  7. 跟踪进程执行的信号。

Linux支持的信号列表如下。很多信号是与机器的体系结构相关的

POSIX.1中列出的信号:
信号 值 处理动作 发出信号的原因
———————————————————————-
SIGHUP 1 A 终端挂起或者控制进程终止
SIGINT 2 A 键盘中断(如break键被按下)
SIGQUIT 3 C 键盘的退出键被按下
SIGILL 4 C 非法指令
SIGABRT 6 C 由abort(3)发出的退出指令
SIGFPE 8 C 浮点异常
SIGKILL 9 AEF Kill信号
SIGSEGV 11 C 无效的内存引用
SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道
SIGALRM 14 A 由alarm(2)发出的信号
SIGTERM 15 A 终止信号
SIGUSR1 30,10,16 A 用户自定义信号1
SIGUSR2 31,12,17 A 用户自定义信号2
SIGCHLD 20,17,18 B 子进程结束信号
SIGCONT 19,18,25 进程继续(曾被停止的进程)
SIGSTOP 17,19,23 DEF 终止进程
SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键
SIGTTIN 21,21,26 D 后台进程企图从控制终端读
SIGTTOU 22,22,27 D 后台进程企图从控制终端写

下面的信号没在POSIX.1中列出,而在SUSv2列出

信号 值 处理动作 发出信号的原因
——————————————————————–
SIGBUS 10,7,10 C 总线错误(错误的内存访问)
SIGPOLL A Sys V定义的Pollable事件,与SIGIO同义
SIGPROF 27,27,29 A Profiling定时器到
SIGSYS 12,-,12 C 无效的系统调用 (SVID)
SIGTRAP 5 C 跟踪/断点捕获
SIGURG 16,23,21 B Socket出现紧急条件(4.2 BSD)
SIGVTALRM 26,26,28 A 实际时间报警时钟信号(4.2 BSD)
SIGXCPU 24,24,30 C 超出设定的CPU时间限制(4.2 BSD)
SIGXFSZ 25,25,31 C 超出设定的文件大小限制(4.2 BSD)

(对于SIGSYS,SIGXCPU,SIGXFSZ,以及某些机器体系结构下的SIGBUS,Linux缺省的动作是A (terminate),SUSv2 是C (terminate and dump core))。

下面是其它的一些信号

信号 值 处理动作 发出信号的原因
———————————————————————-
SIGIOT 6 C IO捕获指令,与SIGABRT同义
SIGEMT 7,-,7
SIGSTKFLT -,16,- A 协处理器堆栈错误
SIGIO 23,29,22 A 某I/O操作现在可以进行了(4.2 BSD)
SIGCLD -,-,18 A 与SIGCHLD同义
SIGPWR 29,30,19 A 电源故障(System V)
SIGINFO 29,-,- A 与SIGPWR同义
SIGLOST -,-,- A 文件锁丢失
SIGWINCH 28,28,20 B 窗口大小改变(4.3 BSD, Sun)
SIGUNUSED -,31,- A 未使用的信号(will be SIGSYS)

(在这里,- 表示信号没有实现;有三个值给出的含义为,第一个值通常在Alpha和Sparc上有效,中间的值对应i386和ppc以及sh,最后一个值对应mips。信号29在Alpha上为SIGINFO / SIGPWR ,在Sparc上为SIGLOST。)

处理动作一项中的字母含义如下
A 缺省的动作是终止进程
B 缺省的动作是忽略此信号
C 缺省的动作是终止进程并进行内核映像转储(dump core)
D 缺省的动作是停止进程
E 信号不能被捕获
F 信号不能被忽略

上 面介绍的信号是常见系统所支持的。以表格的形式介绍了各种信号的名称、作用及其在默认情况下的处理动作。各种默认处理动作的含义是:终止程序是指进程退 出;忽略该信号是将该信号丢弃,不做处理;停止程序是指程序挂起,进入停止状况以后还能重新进行下去,一般是在调试的过程中(例如ptrace系统调 用);内核映像转储是指将进程数据在内存的映像和进程在内核结构中存储的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员提 供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。

注意 信号SIGKILL和SIGSTOP既不能被捕捉,也不能被忽略。信号SIGIOT与SIGABRT是一个信号。可以看出,同一个信号在不同的系统中值可能不一样,所以建议最好使用为信号定义的名字,而不要直接使用信号的值。

只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略,

下面是常用的信号:
HUP 1 终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)

《残梦》威尼斯展映 80后拍“重口味”爱情电影

由80后新锐女导演杨紫婷执导的《残梦》于当地时间9月3日亮相威尼斯电影节,导演杨紫婷携片中的另一位主演孙文婷在威尼斯与各国媒体见面。与之前亮相的华语电影不同,小成本《残梦》主打的悬疑与东方风韵符合国外电影节口味。

第68届威尼斯电影节除了有三部华语片入围竞赛单元外,展映单元也不少华语影片。由80后新锐女导演杨紫婷执导的《残梦》于当地时间9月3日亮相,导演杨紫婷携片中的另一位主演孙文婷在威尼斯与各国媒体见面。与之前亮相的华语电影不同,小成本《残梦》主打的悬疑与东方风韵符合国外电影节口味。

“重口味”爱情电影夹杂悬疑色彩

《残梦》讲述了一个发生在上世纪20、30年代的飘零乱世的故事。影片从上海富豪公子郁成业在新婚之夜中毒身亡开始,在案件侦破的中,将郁公子与孟家姐妹的情感纠葛铺展开来。多年前,失去双亲的姐妹俩孟小梦(杨紫婷饰演)与孟小路(孙文婷饰演)被祝姓富商(午马饰演)收作丫鬟,姐姐孟小梦不幸被富商父子凌辱,从此痛恨男人,对相依为命妹妹产生了特殊情愫。一天,忍无可忍的小梦刺伤祝家父子后,带小路逃跑,两人意外失散。再相见时,小梦化名白梦,成为著名歌手,而妹妹小路正待嫁闺中,未婚夫是富豪公子郁成业。对妹妹有的特殊感情的小梦,不相信郁成业,决定用自己做诱饵让妹妹认清现实。不出所料,郁成业“上钩”,谁知小梦自己也深陷情网。最后,郁成业了结了自己的生命以示真情。《残梦》虽是一部情感戏,但也充满了悬疑色彩。

情色元素是该影片的重要元素之一,对于影片中出现的“重口味”大胆镜头,杨紫婷表示,这是剧情需要。情色镜头是主人公内心情感展现,也是孟家姐妹与郁成业三人关系发展的线索。

80后杨紫婷自编自导自演

曾出演过电视剧《星光大道》、电影《革命到底》的杨紫婷,这次不仅自编、自导、自演,而且还担任制片人,全能上阵演绎了乱世之中孟家两姐妹错综复杂的情感纠葛。谈及影片的创作灵感,杨紫婷介绍说:“故事灵感缘于一次聚会上朋友分享的感情经历。这段感情故事让她感触颇深。经过了半年的酝酿和思考,我决定将这个故事搬上大银幕。因为酝酿时间很长,所以动笔创作却非常顺利。仅用2个半小时就完成了剧本的故事大纲。”此后,剧本又经过6次的修改,最终成形。

《残梦》探讨了乱世之下,两姐妹的情路历程。杨紫婷说:“这部影片我想表达的是人生的无常。在乱世之下,在无助之时,面对无常的人生,两姐妹的情感激起层层波澜。我相信每个人面对生命的无常,都会有一个态度。这个态度是怎样的,我希望在能让观众产生某种共鸣。”

上世纪20、30年代的旧上海,在杨紫婷看来,“是纷乱的,是斑驳的,是每天都在上演传奇的年代”。这样的乱世背景,不仅能增强影片的冲突感,能增强影片的故事性,更能突出人生无常的主题。此外,20、30年代是旗袍盛行的年代。影片中,杨紫婷饰演的孟小梦就有多身旗袍装的展示。她坦言,自己有着难舍的旗袍情结。她说道:“旗袍不单单是一种时装,更像是一种女性的符号。它让女性体态和曲线美充分显示出来,除了彰显女性的风姿之外,却总也透露着些许欲望。”

(本文来源:网易娱乐专稿 文/唐三彩)