《Unix环境高级编程》读书笔记 第10章-信号,unix环境高级编程


1.引言

  • 信号是软件中断
  • 信号提供了一种处理异步事件的方法。

2. 信号概念

  • 信号的名字都是以3个字符SIG开头。
  • Linux3.2.0支持31种信号。FreeBSD、Linux和Solaris作为实时扩展都支持另外的应用程序定义的信号。
  • 在头文件signal.h(其中include的bits/signum.h)中,信号名都被定义为正整数常量,不存在编号为0的信号。kill函数对信号编号0有特殊的应用。

  • 很多条件可以产生信号:

  • 信号是异步事件的经典实例。产生信号的事件对进程而言是随机出现的。进程不能简单地测试一个变量(如errno)来判断是否发生了一个信号,而是必须告诉内核“在此信号发生时,请执行下列操作”。

  • 当某个信号出现时,可以告诉内核按下列3种方式之一进行处理,称之为信号的处理

  • 终止+core。大多数Unix系统调试程序都使用core文件检查进程终止时的状态。

  • 在下列条件下不产生core文件:

  • 4个平台对各种signal的支持及默认处理方式
    主要信号简要说明:

    • SIGABRT。调用abort函数时产生此信号。
    • SIGALRM。当用alarm函数设置的定时器超时时,产生此信号。
    • SIGCHLD。在一个进程终止或停止时,该信号被送给其父进程。按系统默认,将忽略此信号。
    • SIGFPE。表示算术运算异常,如除以0、浮点溢出等。
    • SIGHUP。如果终端接口检测到一个连接断开,则将此信号送给与该终端相关的控制进程(会话首进程)。通常使用此信号通知守护进程再次读取它们的配置文件。选用此信号的理由是:守护进程不会有控制终端,通常决不会接收到这种信号。
    • SIGILL。表示进程执行一条非法硬件指令。
    • SIGINT。当用户按下中断键Ctrl+C时,终端驱动程序产生此信号并发送至前台进程组的每一个进程。
    • SIGIO。指示一个异步I/O事件。
    • SIGTERM。由kill命令发送的系统默认终止信号。
    • SIGKILL。不能捕获或忽略。它向管理员提供了一红杀死任一进程的可靠方法。
    • SIGPIPE。如果在管道的读进程已终止时写管道,则产生此信号。
    • SIGQUIT。当用户在终端上按下退出键Ctrl+\时,终端驱动程序产生此信号并发送给前台进程组中的所有进程。此信号除了终止前台进程组(和SIGINT一样),同时产生一个core文件。
    • SIGSEGV。指示进程进行了一次无效的内存引用。
    • SIGTSTP。交互停止信号。当用户在终端上按下挂起键Ctrl+Z时,终端驱动程序产生此信号,并发送至前台进程组的所有进程。
    • SIGSTOP。类似于交互停止信号(SIGTSTP),但它不能被捕获或忽略。
    • SIGCONT。此作业控制信号发送给需要继续运行,但当前处于停止状态的进程。
    • SIGTTIN。当一个后台进程组进程试图读其控制终端时,终端驱动程序产生此信号。下列情况例外:1. 读进程忽略或阻塞此信号;2. 读进程所属的进程组是孤儿进程组,此时读操作返回出错,errno设置为EIO
    • SIGTTOU。当一个后台进程组进程试图写其控制终端时,终端驱动程序产生此信号。
    • SIGURG。通知进程已经发生一个紧急情况。如带外数据到达。
    • SIGUSR1、SIGUSR2。用户定义的信号,可用于应用程序。

3. 函数signal

  • signal函数由ISO C定义。不涉及多进程、进程组以及终端I/O等,所以它对信号的定义非常含糊,以致于对Unix系统而言几乎毫无用处。
  • 因为signal的语义与实现有关,所以最好使用sigaction函数代替signal函数。
  • 本书中的所有实例均使用图10-18中给出的signal函数,该函数使用sigaction函数是一个平台无关、语义一致的实现。
  • signo参数是上面的信号名。func参数可以是常量SIG_IGN、SIG_DFL或接收到该信号后要调用的函数的地址,即信号处理程序的地址。signal函数的返回值是指向在此之前的信号处理程序的指针。
  • exec,程序启动

    当exec执行一个程序时,所有信号都被设置为它们的默认动作,除非调用exec的进程忽略该信号(则继续保持忽略)。也就是说,exec函数将原先设置为要捕获的信号都更改为默认动作,其他保持不变。因为当exec一个新程序时,信号处理程序的地址很可能在新程序中已无意义。

  • fork,进程创建

    当一个进程调用fork时,其子进程继承父进程的信号处理方式。因为信号处理程序的地址在子进程中是有意义的。

4. 不可靠的信号

  • 早期的Unix版本中,信号是不可靠的。不可靠指的是,信号可能会丢失:一个信号发生了,当进程却可能一直不知道。同时,进程对信号的控制能力很差,它能捕获或忽略它,但不能阻塞。
  • 早期版本的另一个问题是:在进程每次接到信号对其进行处理时,随即将该信号动作重置为默认值。故需要再次建立对该信号的捕获,但在此期间有一个时间窗口。
  • 早期版本的另一个问题是:在进程不希望某种信号发生时,它不能关闭该信号,只能忽略它。

5. 中断的系统调用

  • 早期Unix系统的一个特性是:如果进程在执行一个低速系统调用而阻塞期间捕捉到一个信号,则该系统调用就被中断不再继续运行。该系统调用返回出错,其errno设置为EINTR。
  • 为了支持这种特性,将系统调用分为两类:低速系统调用和其他系统调用。
  • 低速系统调用是可能会使进程永远阻塞的一类系统调用。
  • 与被中断的系统调用相关的问题是必须显式地处理出错返回。典型的代码序列如下:
  • 4.2 BSD引进了某些被中断系统调用的自动重启动,包括ioctl、read、readv、write、writev、wait、waitpid。但是这种自动重启动的处理方式也会带来问题,某些应用程序并不希望这些函数被中断后重启动。为此,4.3 BSD运行进程基于每个信号禁用此功能。
  • POSIX.1要求只有中断信号的SA_RESTART标志有效时,实现才重启动系统调用。
  • 历史上,使用signal函数建立信号处理程序时,对于如何处理被中断的系统调用,各种实现的做法各不相同。
  • 进程捕捉到信号并对其进行处理时,进程正在执行的正常指令序列就被信号处理程序临时中断,它首先执行该信号处理程序中的指令。但是,在信号处理程序中,不能判断捕捉到信号时进程执行到何处:
  • SUS说明了在信号处理程序中保证调用安全的函数。这些函数是可重入的,并被称为异步信号安全的。

  • 没有列入上图的大多数函数是不可重入的,因为:
  • 应当了解,即使信号处理程序调用的是上图中的函数,但是由于每个线程只有一个errno变量,所以信号处理程序可能会修改其原先值。故作为一个通用的规则,先保存,后恢复。

7. SIGCLD语义

8. 可靠信号术语和语义

  • 首先,当造成信号的事件发生时,向进程发送一个信号。
  • 当对信号采取了某种动作时,我们说向进程递送了一个信号。在信号产生和递送之间的时间间隔内,称信号是未决的。
  • 进程可以选用“阻塞信号递送”。内核在递送一个原来被阻塞的信号给进程时(而不是在产生该信号时),才决定对它的处理方式。因此,进程在信号递送给它之前仍可改变对该信号的动作。
  • 每个进程都有一个信号屏蔽字,它规定了当前要阻塞递送到该进程的信号集。进程可以调用sigprocmask函数来检测和更改其当前信号屏蔽字。
  • 进程调用sigpending函数来判定哪些信号是设置为阻塞并处于未决状态的。
  • 如果在进程解除对某个信号的阻塞之前,该信号发生了多次,那么?如果递送该信号多次,则称这些信号进行了排队。除非支持POSIX.1实时扩展,否则大多数Unix并不对信号排队,而只递送一次。

9. 函数kill和raise

  • kill函数将信号发送给进程或进程组
  • raise函数则允许进程向自身发送信号。
  • raise(signo); 等价于 kill(getpid(), signo);
  • kill的pid参数有以下4种情况:
    • pid > 0,发送给进程ID为pid的进程
    • pid == 0,发送给与发送进程属于同一进程组的所有进程
    • pid < 0,发送给其进程组ID等于pid绝对值,而且发送进程具有权限向其发送信号的所有进程
    • pid == -1,发送给发送进程具有权限向它们发送信号的所有进程
  • 关于发送信号的权限

  • POSIX.1 将信号编号为0定义为空信号。如果signo参数为0,则kill仍执行正常的错误检查,当不发送信号。这常被用来确定一个特定进程是否仍然存在。但是,在返回测试结果时,原来存在的被测试进程可能已经终止,所以这种测试并无多大意义。

10. 函数alarm、pause

  • 当定时器超时时,产生SIGALRM信号。信号由内核产生。
  • 每个进程只能有一个闹钟时间。多次调用alarm以新值代替旧值,并返回旧值的余留值。参数为0,则取消以前的闹钟。

  • pause函数使调用进程挂起直到捕捉到一个信号

  • 只有执行了一个信号处理程序并从其中返回时,pause才返回。返回-1,errno设置为EINTR。

11. 信号集

  • POSIX.1定义数据类型sigset_t包含一个信号集,并定义以下5个处理信号集的函数

12. 函数sigprocmask

  • 调用函数sigprocmask可以检测或更改,或同时检测和更改进程的信号屏蔽字
  • how参数:SIG_BLOCK、SIG_UNBLOCK、SIG_SETMASK
  • 在调用sigprocmask后如果有任何未决的、不再阻塞的信号,则在其返回之前,至少将其中之一递送给该进程。

13. 函数sigpending

  • sigpending函数返回一信号集,它对于调用进程而言,其中的各信号是阻塞不能递送的

14. 函数sigaction

  • sigaction函数的功能是检查或修改与指定信号相关联的处理动作

     原创文章,转载请声明出处:http://www.cnblogs.com/DayByDay/p/3948397.html


汤姆索亚历险记读书笔记 7-35章每看完10章写一篇读书笔记,概括情节,写3篇 拜托啦各位,很急

100字的要吗 ——————————————————————————————————— 第一章 汤姆耍斗,东躲西藏 汤姆很顽劣,一有机会就逃学,偷东西吃,总是挨他姨妈的揍,这天在路上,他遇见了刚搬到这地方的一个男孩子,汤姆见他作为一个孩子,却穿的如此整洁而极是气愤,两人胡说一气,然后滚在尘土中打了起来,汤姆打赢了。波莉姨妈决心要让他干活。 第二章 无奈刷墙,成绩辉煌 这个胜利者的衣服因为打架而破烂污秽,姨妈罚他去把墙刷白,汤姆把刷墙说成是可以放纵恣意的艺术,过路的孩子都眼红了,情愿把心爱的东西交给他,以换取一次刷墙的机会,汤姆就悠闲地坐在一旁,一边吃苹果,一边晒太阳。 第三章 打仗恋爱忙得汤姆不亦乐乎 汤姆见到并爱上了可爱的蓓姬,他在栅栏外想方设法让小女孩注意他,他从她那得到了一朵三色堇。他回家,姨妈错怪他揍了他一顿,他不想活了,去到蓓姬的窗下躺着准备死掉,一个女仆泼了一盆冷水下去,汤姆成了一个落水狗,在夜色中飞一般跑回家了 第四章 主日学校,风头出尽 汤姆用他的财宝换来了各种颜色的票,在主日学校,汤姆见到了蓓姬一家,汤姆想尽办法出风头希望蓓姬注意他,还用票换了一本圣经,蓓姬的母亲问他基督最初的两个门徒是谁,他不知道但却自信的胡扯,让所有人都吃了很大的一惊。 第五章 礼拜添花样,大钳甲虫戏小狗 布道开始了,汤姆玩弄着他的甲虫,甲虫咬了汤姆一下,逃走了,后来一只狗和甲虫打了起来,狗坐在了甲虫上面,甲虫咬了它一下,狗跳到主人的怀里,而主人却把它扔了出去,教堂内一阵哄笑,可怜的牧师不知道发生了什么事。 第六章 汤姆识蓓姬,耳痛心欢喜 汤姆想利用牙疼逃学,姨妈把牙拔了下来,他没有借口逃学了。在路上,汤姆遇到了野孩子哈克,结果汤姆迟到了。老师罚他和蓓姬同桌,汤姆在石板上写了我爱你,汤姆磨蹭了一会才让她看,蓓姬说,你这坏蛋,心里却乐呵呵的。 第七章 扁虱之争,蓓姬伤心 上课时,汤姆和哈克在一块玩那只虱子,他们投入的玩,不久争吵起来,老师收拾了他们。中午,汤姆让蓓姬和他订婚,还吻了她,但汤姆说漏了嘴,让蓓姬知道了他还曾与亚美订过婚,蓓姬哭起来,汤姆没办法,就伤心的走了,蓓姬后悔起来。 第八章 勇当海盗,预演绿林 汤姆离开平常走的那些小道,到了一个茂密偏僻的森林里,幻想着自己的未来,想着将来去做强盗,酋长,海盗,当了名人后重返故里后的情形,然后他和哈泼一起扮演古代的绿林英雄相互打着玩,他扮演的是罗宾汉。 第九章 坟地惨案,波特受过 一天晚上10点多,汤姆和哈克伯利一起去一块坟地想听一听死人的说话声,却亲眼目睹了一个凶杀案,来盗墓的印第安人乔祖杀了一个医生,把刀放在同伙波特手里,波特醉酒醒来,却错以为是自己杀了医生。 第十章 狗吠不祥,雪上加霜 汤姆和哈克贝利没命似的跑到了皮厂,他们写了血书,发誓誓死保守秘密。狗吠声让他们又紧张起来,他们又出发冒险。第二天, 汤姆黯然无神,内心痛苦不堪的来到了学校,却看见了他送给的蓓姬的铜把手放在桌上,他彻底失去了信心 第十一章 波特有口难辩,汤姆良心受谴 沫夫波得受了印第安人乔祖的冤枉使得大家认为那个医生就是他自己在喝醉酒的情况下杀死的,于是就向警方投案自首,之后进了监狱,但知道事实的汤姆和哈克都十分难受,于是便一面想尽一切方法安慰波得,一面接受着良心的折磨 第十二章 汤姆喂猫药,姨妈心开窍 蓓姬很难过,好几天都不来上课,汤姆想和她和好,又碍于面子不开口,于是忧愁苦恼,姨妈以为他生病了,拿他做试验体用各种土方治疗,给他喝药,汤姆把一只猫的嘴撬开,都让它喝了,猫神经亢奋,在屋里狂奔。汤姆又去学校,可是蓓姬不睬他 第十三章 “海盗”......余下全文>>
 

钢铁是怎炼成的读书笔记分章(10章以上)

第一章
十二岁那年,保尔•柯察金离开了学校。因为补考的时候,他把烟灰撒在了瓦西里神甫家做的复活节蛋糕的面团上了。不得已,保尔跟着母亲来到车站的食堂干活,在这里,他被老板打发到洗涮车间,负责烧茶炉,擦刀叉和倒脏水等一些粗活脏活。
在食堂干活的日子里,保尔受尽老板娘的压迫,也看到了生活在社会底层的人们的艰辛痛苦、贫穷,并且十分憎恶那些花天酒地的有钱人。不久,哥哥阿尔焦姆为他在发电厂找了一份工作,保尔离开了食堂。

第二章
沙皇被推翻的消息传来。但镇上的人的生活没有发生什么大的改变,只是这里出现了越来越多被称为“布尔什维克”的士兵。
镇上发生了一些变化,有的富人逃跑了。红军战士出现了,镇上的市民得到了红军发的枪支。很快,红军撤退,德国人进来了,他们要求市民缴纳枪支。有钱的富人又回来了。
保尔结识了装配工朱赫来,两人成为了好朋友,朱赫来教会了保尔打拳,还时常给保尔讲一些革命道理。保尔把偷的枪藏在院子里,德军搜查时没有发现。

第三章
保尔在湖边钓鱼时,结识了林务官的女儿冬妮娅。她没有像别的富家子女一样嘲弄和侮辱保尔,两人很快认识了。
车站的工人们罢了工,阿尔焦姆等三位工人在被迫开车时,为了自己和其他起义军的安全杀了一个德国人,之后跳车逃到乡下。但他们的家人打听不到他们的消息了。
冬妮娅在湖边读书,看见了游泳的保尔。他们在一起聊天,成了朋友。保尔为了养活自己和妈妈,再买一套新衣服,又找了一份锯木的工作。打扮一新的保尔让冬妮娅很惊喜。

第四章
冬妮娅给塔尼亚写信,倾诉自己的心事。
城里唯一的剧院举行了盛大的晚会,佩特留拉派士绅界的很多人都出席了。保尔被押去发电。帕夫柳克趁舞会热闹时闯进来,又因乐曲的问题和戈卢勃打架。场内十分混乱。
城里有“烧杀掳掠犹太人”的传闻不胫而走,引起很多人的恐慌,谢廖沙等人商量着藏身的地方和方法。戈卢勃和帕夫柳克双方发生冲突后第三天,虐杀犹太人的暴行开始了。可怕的三天两夜里,有很多人被杀戮和摧残。但只有几个人抵抗。

第五章
一天晚上,朱赫来为了躲避搜捕,藏到了保尔家。在保尔家里,朱赫来给保尔讲述了很多革命道理。保尔懂得了生命的真理,也知道了朱赫来是共产党。
这八天里,朱赫来总是傍晚时出去,深夜再回来。一天晚上,朱赫来出去后就没有回来。保尔在街上打听朱赫来的下落,还回忆了与冬妮娅吵架的经过。当他看到朱赫来被一个士兵押解着时,果断地把押送兵扑倒,救了朱赫来。当晚,朱赫来离开了小镇,但保尔被维克托告发,之后被抓到城防司令部。

第六章
冬妮娅得知保尔被抓走,很着急,四处找他。
彼得留拉匪帮的头目要来镇上检阅部队,镇上忙着做准备。捷涅克上校不愿让头目看到监狱里关押太多的犯人,便将保尔等人放了出来。保尔离开了监狱,但他没有地方可去,就毫无目的地跑着,不知不觉来到冬妮娅家的花园里。狗叫声惊动了冬妮娅,当她认出是保尔时,她很激动,把保尔留在了家里。保尔在冬妮娅家得到了休息,但又不愿意连累冬妮娅,就执意要离开冬妮娅的家。他们约定不忘记对方。

第七章
苏维埃政权建立了,乌克兰共青团地方委员会建立起来了,红军攻占了谢别托夫卡小镇。谢廖沙不顾母亲阻拦,加入红军,成为了一个布尔什维克。他是共青团员、团区委书记。他还组织自己的伙伴和姐姐参加共青团。但在会议上,却只有一个人参加组织,谢廖沙有些泄气,其他人鼓励了他。
保尔的腿被打伤了,他住院时来了信,谢廖沙和丽达去湖边时遇见了冬妮娅,并把信给她看。谢廖沙和丽达在一起聊天还练习了枪法。
丽达走后,谢廖沙很伤心。

第八章
保尔加入了布琼尼的骑兵部队。他和几千名战士一起英勇战斗着。在日托米尔,骑兵......余下全文>>
 

相关内容

    暂无相关文章