




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、可行性分析1(一)、信号及信号来源1(二)信号的种类4(三)试验11一、可行性分析信号是通知进程已发生某种条件的一种技术。例如,若某一进程执行除法操作,其除数为0,则将名为SIGFPE的信号发送给该进程。进程如何处理信号有三种选择:* 忽视该信号。有些信号表示异常发生,例如,除以0或访问进程地址空间以外的单元等,因为这些异常产生的后果不确定,所以不推荐使用这种处理方式。 * 按系统默认方式处理。对于0除,系统默认方式是终止该进程。* 提供一个函数,信号发生时则可以调用该函数。使用这种方式,我们将能够知道什么时候产生了信号,并按所希望的方式处理它。由此可见,利用信号机制,可以实现对一些异常信息的监控处理;为了更好的理解,有必要先对信号的原理,以及处理机制进行描述:(一)、信号及信号来源信号本质信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。信号来源信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。注:就我们目前的应用目的来说,我们的重点应该是软件来源的信号.现在分析一下软件来源的几个信号发送系统函数:1、kill()#include #include int kill(pid_t pid,int signo)参数pid的值 信号的接收进程/线程 pid0 进程ID为pid的进程/线程 pid=0 同一个进程组的进程 pid0时的信号发送,调用成功返回 0; 否则,返回 -1。注:对于pid0时的情况,对于哪些进程将接受信号,各种版本说法不一,其实很简单,参阅内核源码kernal/signal.c即可,上表中的规则是参考red hat 7.2。2、raise()#include int raise(int signo)向进程本身发送信号,参数为即将发送的信号值。调用成功返回 0;否则,返回 -1。3、sigqueue()#include #include int sigqueue(pid_t pid, int sig, const union sigval val)调用成功返回 0;否则,返回 -1。sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然也支持前32种),支持信号带有参数,与函数sigaction()配合使用。sigqueue的第一个参数是指定接收信号的进程ID,第二个参数确定即将发送的信号,第三个参数是一个联合数据结构union sigval,指定了信号传递的参数,即通常所说的4字节值。 typedef union sigval int sival_int; void *sival_ptr; sigval_t; sigqueue()比kill()传递了更多的附加信息,但sigqueue()只能向一个进程发送信号,而不能发送信号给一个进程组。如果signo=0,将会执行错误检查,但实际上不发送任何信号,0值信号可用于检查pid的有效性以及当前进程是否有权限向目标进程发送信号。在调用sigqueue时,sigval_t指定的信息会拷贝到3参数信号处理函数(3参数信号处理函数指的是信号处理函数由sigaction安装,并设定了sa_sigaction指针,稍后将阐述)的siginfo_t结构中,这样信号处理函数就可以处理这些信息了。由于sigqueue系统调用支持发送带参数信号,所以比kill()系统调用的功能要灵活和强大得多。注:sigqueue()发送非实时信号时,第三个参数包含的信息仍然能够传递给信号处理函数; sigqueue()发送非实时信号时,仍然不支持排队,即在信号处理函数执行过程中到来的所有相同信号,都被合并为一个信号。根据这个属性: 当我们使用sigaction()函数时,可以利用该结构得到一些额外的信息,例如出现问题的线程的ID,信号值,如果是非法的算术错误的话,还可以给出是那种错误,例如除0错误等.4、alarm()#include unsigned int alarm(unsigned int seconds)专门为SIGALRM信号而设,在指定的时间seconds秒后,将向进程本身发送SIGALRM信号,又称为闹钟时间。进程调用alarm后,任何以前的alarm()调用都将无效。如果参数seconds为零,那么进程内将不再包含任何闹钟时间。返回值,如果调用alarm()前,进程中已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。5、setitimer()#include int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);setitimer()比alarm功能强大,支持3种类型的定时器:ITIMER_REAL: 设定绝对时间;经过指定的时间后,内核将发送SIGALRM信号给本进程; ITIMER_VIRTUAL 设定程序执行时间;经过指定的时间后,内核将发送SIGVTALRM信号给本进程; ITIMER_PROF 设定进程执行以及内核因本进程而消耗的时间和,经过指定的时间后,内核将发送ITIMER_VIRTUAL信号给本进程; Setitimer()第一个参数which指定定时器类型(上面三种之一);第二个参数是结构itimerval的一个实例,结构itimerval形式见附录1。第三个参数可不做处理。Setitimer()调用成功返回0,否则返回-1。6、abort()#include void abort(void);向进程发送SIGABORT信号,默认情况下进程会异常退出,当然可定义自己的信号处理函数。即使SIGABORT被进程设置为阻塞信号,调用abort()后,SIGABORT仍然能被进程接收。该函数无返回值。在这几个函数中在我们具体的实现中调用的可能性需要进一步分析. 可能我们用的比较多的是abort()函数. 而kill(),raise(),sigqueue()用的应该比较少.除此之外,软件产生的信号中,我们的重点可能应该在一些非法运算错误上.非法运算错误如:SIGFPE, SIGSEGV等.对信号的处理:可以通过三种方式来响应一个信号:(1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP;(2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;(3)执行缺省操作,Linux对每种信号都规定了默认操作,详细情况请参考有关资料。注意,进程对实时信号的缺省反应是进程终止。从上可知: linux提供了对信号的捕捉机制, 从而使得我们可以对那些感兴趣的信号进行捕获, 然后根据实现的需要, 调用自己的信号处理函数.(二)信号的种类可以从两个不同的分类角度对信号进行分类:(1)可靠性方面:可靠信号与不可靠信号;(2)与时间的关系上:实时信号与非实时信号。1、可靠信号与不可靠信号不可靠信号Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做不可靠信号,信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可靠信号。这就是不可靠信号的来源。它的主要问题是:进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。 信号可能丢失,后面将对此详细阐述。因此,早期unix下的不可靠信号主要指的是进程可能对信号做出错误的反应以及信号可能丢失。 Linux支持不可靠信号,但是对不可靠信号机制做了改进:在调用完信号处理函数后,不必重新调用该信号的安装函数(信号安装函数是在可靠机制上的实现)。因此,Linux下的不可靠信号问题主要指的是信号可能丢失。可靠信号随着时间的发展,实践证明了有必要对信号的原始机制加以改进和扩充。所以,后来出现的各种Unix版本分别在这方面进行了研究,力图实现可靠信号。由于原来定义的信号已有许多应用,不好再做改动,最终只好又新增加了一些信号,并在一开始就把它们定义为可靠信号,这些信号支持排队,不会丢失。同时,信号的发送和安装也出现了新版本:信号发送函数sigqueue()及信号安装函数sigaction()。POSIX.4对可靠信号机制做了标准化。但是,POSIX只对可靠信号机制应具有的功能以及信号机制的对外接口做了标准化,对信号机制的实现没有作具体的规定。信号值位于SIGRTMIN和SIGRTMAX之间的信号都是可靠信号,可靠信号克服了信号可能丢失的问题。Linux在支持新版本的信号安装函数sigation()以及信号发送函数sigqueue()的同时,仍然支持早期的signal()信号安装函数,支持信号发送函数kill()。注:不要有这样的误解:由sigqueue()发送、sigaction安装的信号就是可靠的。事实上,可靠信号是指后来添加的新信号(信号值位于SIGRTMIN及SIGRTMAX之间);不可靠信号是信号值小于SIGRTMIN的信号。信号的可靠与不可靠只与信号值有关,与信号的发送及安装函数无关。目前linux中的signal()是通过sigation()函数实现的,因此,即使通过signal()安装的信号,在信号处理函数的结尾也不必再调用一次信号安装函数。同时,由signal()安装的实时信号支持排队,同样不会丢失。对于目前linux的两个信号安装函数:signal()及sigaction()来说,它们都不能把SIGRTMIN以前的信号变成可靠信号(都不支持排队,仍有可能丢失,仍然是不可靠信号),而且对SIGRTMIN以后的信号都支持排队。这两个函数的最大区别在于,经过sigaction安装的信号都能传递信息给信号处理函数(对所有信号这一点都成立),而经过signal安装的信号却不能向信号处理函数传递信息。对于信号发送函数来说也是一样的。2、实时信号与非实时信号早期Unix系统只定义了32种信号,Ret hat7.2支持64种信号,编号0-63(SIGRTMIN=31,SIGRTMAX=63),将来可能进一步增加,这需要得到内核的支持。前32种信号已经有了预定义值,每个信号有了确定的用途及含义,并且每种信号都有各自的缺省动作。如按键盘的CTRL C时,会产生SIGINT信号,对该信号的默认反应就是进程终止。后32个信号表示实时信号,等同于前面阐述的可靠信号。这保证了发送的多个实时信号都被接收。实时信号是POSIX标准的一部分,可用于应用进程。非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。目前系统支持的信号为:1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO30) SIGPWR 31) SIGSYS 32) SIGRTMIN 33) SIGRTMIN+134) SIGRTMIN+2 35) SIGRTMIN+3 36) SIGRTMIN+4 37) SIGRTMIN+538) SIGRTMIN+6 39) SIGRTMIN+7 40) SIGRTMIN+8 41) SIGRTMIN+942) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+1346) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMAX-15 49) SIGRTMAX-1450) SIGRTMAX-13 51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-1054) SIGRTMAX-9 55) SIGRTMAX-8 56) SIGRTMAX-7 57) SIGRTMAX-658) SIGRTMAX-5 59) SIGRTMAX-4 60) SIGRTMAX-3 61) SIGRTMAX-262) SIGRTMAX-1 63) SIGRTMAX 下面比较详细的说明这些信号:* SIGABRT 调用abort函数时产生此信号.进程异常终止.* SIGALRM 超过用alarm函数设置的时间时产生此信号.若由settimer(2)函数设置的间隔时间已经过时,那么也产生此信号.* SIGBUS 指示一个实现定义的硬件故障.* SIGCHLD 在一个进程终止或者停止时,SIGCHLD信号被送给其父进程.按系统默认,将忽略该信号.如果父进程希望了解其子进程的这种状态改变,则应该捕获该信号.信号捕捉函数中通常要调用wait函数以取得子进程ID和其终止状态.当一个进程正常或者异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是个异步事件(这可以在父进程运行的任何时候发生),所以这种信号也是内核向父进程发的异步通知。* SIGCONT 此作业控制信号送给需要继续运行的处于停止状态的进程.如果收到此信号的进程处于停止状态,则系统默认动作使该进程继续运行,否则默认动作是忽略该信号.例如:vi编辑程序在捕捉到该信号后,重新绘制终端屏幕.* SIGEMT 指示一个实现定义的硬件故障. * SIGFPE 此信号表示一个算术运算异常,例如除以0,浮点溢出等。* SIGHUP 如果终端界面检测到一个连接断开,则将此信号送给与该终端相关的控制进程(对话期首进程)。此信号送给session结构中s-leader字段所指向的进程。仅当终端的CLOCAL标志没有设置时,在上述条件下才产生此信号。(如果所连接的终端是本地的,才设置该终端的CLOCAL标志。它告诉终端驱动程序忽略所有调制解调器的状态行。)注意,接到此信号的对话期首进程可能在后台。这区别于通常由终端产生的信号(中断、退出和挂起),这些信号总是传递给前台进程组。如果对话期前进程终止,则也产生此信号。在这种情况,此信号送给前台进程组中的每一个进程。通常用此信号通知精灵进程以再读它们的配置文件。为此选用SIGHUP的理由是,因为一个精灵进程不会有一个控制终端,而且通常决不会接收到这种信号。SIGKILL 此信号指示进程已执行一条非法硬件指令。4.3BSD由abort函数产生此信号。SIGABRT现在用于这种情况。* SIGINFO 这是一种4.3+BSD信号,当用户按状态键(常常是Control-T)时,终端驱动程序产生此信号并送至前台进程组中的每一个进程。此信号通常造成在终端上显示前台进程组中各进程的状态信息。* SIGINT 当用户按中断键(常常是DELETE或Control-C)时,终端驱动程序产生此信号并送至前台进程组中的每一个进程。当一个进程在运行时失控,特别是它正在屏幕上产生大量不需要的输出时,常用此信号终止它。* SIGIO 此信号指示一个异步IO事件。对SIGIO的系统默认动作是终止或忽略.不幸的是,这依赖于系统.在SVR4中,SIGIO与SIGPOLL相同,其默认动作是终止此进程。在43+BSD中(此信号起源于4.2BSD),其默认动作是忽略它。* SIGIOT 这指示一个实现定义的硬件故障。IOT这个名字来自于PPP-11对于输入输出TRAP(inputoutput TRAP)指令的缩写。系统V的早期版本,由abort函数产生此信号.SIGABRT现用于这些情况。* SIGKILL 这是两个不能被捕捉或忽略信号中的一个。它向系统管理员提供了一种可以消灭任一进程的可靠方法。* SIGPIPE 如果在读进程已终止时写管道,则产生信号SIGPIPE。当套接口的一端已经终止时,一个进程写该插口也产生此信号。* SIGPOLL 这是一种SVR4信号,当在一个可轮询设备上发生一特定事件时产生此信号。它与4.3+BSD的SIGIO和SIGURG信号相接近.* SIGPROF 将setitimer(2)函数设置的梗概统计间隔时间已经超过时产生此信号。* SIGPWR 这是一种SVR4信号,它依赖于系统。它主要用于具有不间断电源(UPS)的系统上。如果电源失效,则UPS就会起作用,而且通常软件会接到通知。在这种情况下,系统依靠蓄电池电源继续运行,所以无须作任何处理。但是如果蓄电池也将不能支持工作,则软件通常会再次接到通知,此时,它在15秒内使系统各部分都停止运行。此时应当传递SIGPWR信号。在大多数系统中使接到蓄电池电压过低的进程将信号SIGPWG发送给init进程,然后由init处理停机操作。很多系统V的init实现在inittab文件中提供了两个记录项用于此种目的;powerfail以及powerwait.目前已能获得低价格的UPS系统,它用RS-232串行连接能够很容易地将蓄电池电压过低的条件通知系统,于是这种信号也就更加重要了。* SIGQUIT 当用户在终端上按退出键(常常是Control-)时,产生此信号,并送至前台进程组中的所有进程。此信号不仅终止前台进程组(如SIGINT所做的那样),它也产生一个core文件。* SIGSEGV 此信号指示进程进行了一次无效的存储访问。名字SEG表示段违例(segmentation violation)。* SIGSTOP 这是一个作业控制信号,它停止一个进程。它类似于交互停止信号(SIGTSTP),但是SIGSTOP不能被捕促或忽略。* SIGSYS 这指示一个无效的系统调用。由于某种未知原因,进程执行了一条系统调用指令,但其指示系统调用类型的参数却是无效的。* SIGTERM 这是由kill(1)命令发送的系统默认终止信号。* SIGTRAP 这指示一个实现定义的硬件故障。此信号名来自于PPP-11的TRAP指令。* SIGTSTP 这是交互停止信号,当用户在终端上按挂起键*(常常是Control-Z)时,终端驱动程序产生此信号。* SIGTTIN 当一个后台进程组进程试图读其控制终端时,终端驱动程序产生此信号。在下列例外情形下,不产生此信号,此时读操作出错返回,errno设置为EIO:(a)读进程忽略或阻塞此信号,或(b)读进程所属的进程组是孤儿进程组。* SIGTTOU 当一个后台进程组进程试图写其控制终端时产生此信号. 与上面所述的SIGTTIN信号不同,一个进程可以选择为允许后台进程写控制终端。如果不允许后台进程写,则与SIGTTIN相似也有两种特殊情况:(a)写进程忽略或阻塞此信号,式(b)写进程所属进程组是孤儿进程组。在这两种情况下不产生此信号,写操作出错返回,errno设置为EIO。不论是否允许后台进程写,某些除写以外的下列终端操作也能产生此信号:tcsetatlr,tcsendbreak,tcdrain,tcflush,tcflow以及tcsetpgrp。* SIGURG 此信号通知进程已经发生一个紧急情况。在网络连接上,接到非规定波特率的数据时,此信号是可选择地产生的。* SIGUSR1 这是一个用户定义的信号,可用于应用程序。* SIGUSR2 这是一个用户定义的信号,可用于应用程序。* SIGVTALRM 当一个由setitimer(2)函数设置的虚拟间隔时间已经超过时产生此信号。* SIGWINCH SVR4和43+BSD系统核保持与每个终端或伪终端相关联的*不幸的是语术停止(stop)有不同的意义。在讨论作业控制和信号时我们需提及停止(stopping)和继续作业。但是终端驱动程序一直用术语停止表示用Control-S和Control-Q字符停止和起动终输出。因此,终端驱动程序将产生交互停止信号和字符称之为挂起字符(suspend)而非停止字符。窗口的大小、一个进程可以用ioctl函数得到或设置窗口的大小。如果一个进程用ioctl的设置-窗口-大小命令更改了窗口大小,则系统核将SIGWINCH信号送至在前台进程组。* SIGXCPU SVR4和43+BSD支持资源限制的概念。如果进程超过了其软CPU时间限制,则产生SIGXCPU信号。* SIGXFSZ 如果进程超过了其软文件长度限制,则SVR4和43+BSD产生此信号。有些资料中将一些常用的信号归结如下:符号名信号值 描述SIGHUP1 在控制终端上检测到挂断或控制线程死亡SIGINT 2 终端中断符SIGQUIT 3 终端退出符SIGILL 4 检测到非法硬件的指令SIGTRAP 5 从陷阱中回朔SIGABRT 6 异常终止信号SIGEMT7 EMT指令 SIGFPE 8 不正确的算术操作信号SIGKILL 9 终止信号SIGBUS10 总线错误SIGSEGV 11 检测到非法的内存调用SIGSYS 12 系统call的错误参数,无效的系统调用SIGPIPE 13 在无读者的管道上写SIGALRM 14 报时信号,超时(alarm)SIGTERM 15 终止信号SIGURG16 IO信道紧急信号SIGSTOP 17 暂停信号SIGTSTP 18 交互暂停信号,终端挂起符SIGCONT 19 如果暂停则继续, 使暂停进程继续SIGCHLD 20 子线程终止或暂停SIGTTIN 21 后台线程组一成员试图从控制终端上读出SIGTTOU 22 后台线程组的成员试图写到控制终端上SIGIO 23 允许I/O信号, 异步IO SIGXCPU 24 超出CPU时限, 超过CPU限制(setrlimit) SIGVTALRM 26 虚时间警报器(setitimer)SIGPROF 27 侧面时间警报器SIGWINCH28 终端窗口大小的更改SIGINFO 29 消息请求, 键盘状态请求SIGUSR1 30 保留作为用户自定义的信号1 SIGUSR2 31 保留作为用户自定义的信号2另外还有资料对进行如下的分类:信号被分为两类:陷阱(traps)和意外(exceptions,同步信号); 和中断(interrupts,异步信号)。同步信号 陷阱(例如SIGILL, SIGFPE, SIGSEGV)发生在线程自身的操作之后,例如除零错误或者显式地发信号给自身。一个陷阱仅仅被导致它的线程来控制。所以进程中的几个线程可以同时产生和控制同类陷阱。 扩展信号到独立线程的主张对于同步信号来说是容易的-信号被导致问题的线程来处理。然而,如果一个线程没有处理这个问题,例如通过sigaction(2)建立一个信号控制器,整个进程将终止。因为一个同步信号通常意味着整个进程的严重错误,而不只是一个线程,终止进程通常是一个明智的做法。在我们的程序来说,我们通常要处理的是SIGILL, SIGFPE, SIGSEGV这样的同步消息;这类消息总结如下:SIGILL:此信号指示线程或者进程已经执行了一条非法硬件指令。SIGFPE: 此信号表示一个算术运算异常,例如除以0,浮点溢出等;SIGSEGV:此信号表示线程或者进程进行了一次无效的存储访问,SEGVsegmentation villation 段违例SIGABRT:调用abort函数时,产生此信号,进程异常终止。异步信号 中断(例如SIGINT和SIGIO)是与任何线程异步的,它来自于进程外部的一些操作。 它们也许是显式地送到其他线程的信号,或者是例如Control-c的外部操作,处理异步信号比处理同步信号要复杂的多。 一个中断被任何线程来处理,如果线程的信号掩模允许的话。如果有多个线程可以接收中断,只有一个被选中。 如果并发的多个同样的信号被送到一个进程,每一个将被不同的线程处理,如果线程的信号掩模允许的话。如果所有的线程都屏蔽该信号,则这些信号挂起,直到有信号解除屏蔽来处理它们。读者注:所以对于异步信号,可以让其他的线程对这些信号都屏蔽,而生长一个单独的线程来处理这些函数。问题: 通常产生和发送这些异步信号应该是程序操作者或者编程人员的主动行为?(三)试验对于同步消息,因为只能由导致这个消息发生的线程来处理,所以我们做了如下的试验来处理这类信号;#include #include #include #include #include /* function deal with SIGFPE signal, defined by user */void dealwithSIGFPE(int _param1, siginfo_t* _param2,void* _param3) pthread_t pidself; pidself = pthread_self(); if (_param2-si_code = FPE_INTDIV) printf(ERROR: integer divide by zero;rn); if (_param2-si_code = FPE_INTOVF) printf(ERROR: integer overflow;rn); if (_param2-si_code = FPE_FLTDIV) printf(ERROR: floating point divede by zero;rn); if (_param2-si_code = FPE_FLTOVF) printf(ERROR: floating point overflow;rn); if (_param2-si_code = FPE_FLTUND) printf(ERROR: floating point underflow;rn); if (_param2-si_code = FPE_FLTRES) printf(ERROR: floating point inexact result;rn); if (_param2-si_code = FPE_FLTINV) printf(ERROR: floating point invalid operation;rn); if (_param2-si_code = FPE_FLTSUB) printf(ERROR: subscript out of range;rn); printf(the thread ID: %d, memory locate which cause fault:0x%x rn , pidself, _param2-si_addr); pthread_exit(NULL);/* thread 1 function */void writeThread1(void *_tempparam) struct sigaction act; sigemptyset(&act.sa_mask); act.sa_flags=SA_SIGINFO; act.sa_sigaction=dealwithSIGFPE; if (sigaction(SIGFPE, &act, NULL) 0) printf(install sigal errorn); sleep(5);/* thread 2 function */void writeThread2(void * _tempparam) struct sigaction act; double m; double n; sigemptyset(&act.sa_mask); act.sa_flags=SA_SIGINFO; act.sa_sigaction=dealwithSIGFPE; if (sigaction(SIGFPE, &act, NULL) 0) printf(install sigal err
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2032年新能源汽车充电站智能充电与能源互联网融合发展报告
- 2025年低空经济区域标准互认对航空产业发展规划的指导报告
- 跨学科主题-多媒体表达说课稿-2025-2026学年小学信息技术(信息科技)三年级下册鲁教版(信息科技)
- Unit 3 It must belong to Carla.教学设计初中英语鲁教版五四学制2012九年级全册-鲁教版五四学制2012
- 2025年生物质能发电项目融资渠道与风险控制分析报告
- 2024-2025学年高中物理 第8章 气体 1 气体的等温变化说课稿3 新人教版选修3-3
- Module 10 Unit 1说课稿-2025-2026学年外研版英语七年级下册
- 解析卷人教版八年级上册物理声现象《声音的产生与传播》专题攻克试题(含解析)
- 2024-2025学年高中生物 第五章 基因突变及其它变异 第2节 染色体变异说课稿4 新人教版必修2
- 1.3.1微生物的分布 说课稿-2024-2025学年人教版生物七年级上册
- 小学一年级音乐教案《其多列》及反思
- FZ/T 73070-2022针织面料型胸贴
- GB/T 25853-20108级非焊接吊链
- GB/T 12467.5-2009金属材料熔焊质量要求第5部分:满足质量要求应依据的标准文件
- 中国精神弘扬焦裕禄精神PPT传承爱国精神传承红色精神向焦裕禄学习PPT课件(带内容)
- DIP插件外观检验标准
- 天津科万物业设备台帐
- 数字电子技术说课
- 易文化与中医学课件
- 提高粘滞流体阻尼器埋件的一次验收合格率
- JIS G4304-2021 热轧不锈钢板材、薄板材和带材
评论
0/150
提交评论