C语言的进程中断与信号处理函数

#include "csapp.h"

/*编写sleep的包装函数,snooze函数,返回一个进程实际休眠了多少时间*/
unsigned int snooze(unsigned int secs) //secs为总休眠时间
{
  unsigned int timeLeft;
  unsigned int timeAll=secs;
  timeLeft=sleep(timeAll);
  printf("Slept for %u of %u secs \n", timeAll-timeLeft,timeAll);
  return timeLeft;
}

void handler(int sig)
{
  return; //结束进程,并返回进程的返回值
}

int main(int argc,char *argv[])
{
  if(signal(SIGINT,handler)==SIG_ERR)
    printf("signal error");
  if(argv[1]==NULL) {
    printf("需要指明参数,即休眠的时间长度\n");
    exit(0);
  }
  (void) snooze(atoi(argv[1])); //atoi是用来将字符串转换成整型数据
  exit(0);
}

当程序执行时,按住ctrl+C中断进程,返回值例如下所示

Slept for 2 of 4 secs
时间: 2024-10-24 21:38:49

C语言的进程中断与信号处理函数的相关文章

信号处理函数误用不可重入函数导致的进程死锁情况

记一次进程死锁的情况: 某天突然发现进程不再运行处理且有没有崩溃产生core文件: 使用gdb -p pid查看堆栈信息如下: 1 #0 0x000000376faf83ae in __lll_lock_wait_private () from /lib64/libc.so.6 2 #1 0x000000376fa7d35b in _L_lock_10288 () from /lib64/libc.so.6 3 #2 0x000000376fa7ab83 in malloc () from /l

2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,

 1信号产生原因 2.进程处理信号行为 manpage里信号3中处理方式: SIG_IGN SIG_DFL                                            默认Term动作 a signal handling function 进程处理信号 A默认处理动作 term   中断 core    core(调试的时候产生) gcc –g file.c ulimit –c 1024 gdb a.out core ign      忽略 stop     停止

Linux信号、信号处理和信号处理函数

信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据. 一.信号的来源 信号的来源可以有很多种试,按照产生条件的不同可以分为硬件和软件两种. 1.  硬件方式 当用户在终端上按下某键时,将产生信号.如按下组合键后将产生一个SIGINT信号. 硬件异常产生信号:除数据.无效的存储访问等.这些事件通常由硬件(如:CPU)检测到,并将其通知

linux 中的进程wait()函数

转载自:http://blog.sina.com.cn/s/blog_7776b9d3010144f9.html 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程-- 一个进程在调用exit

在信号处理函数中调用longjmp

错误情况及原因分析 前两天看APUE的时候,有个程序要自己制作一个sleep程序,结果在这个程序中就出现了在信号处理函数中调用longjmp函数的情况,结果就出现了错误,具体错误是啥呢,请参见下面这段程序: 1 /* 2 * 在信号处理函数中调用longjmp的错误情况 3 */ 4 #include <errno.h> 5 #include <setjmp.h> 6 #include <signal.h> 7 #include <string.h> 8 #

linux下的信号处理函数总结

1.信号处理函数 相关函数原型如下: #include <signal.h> sighandler_t signal(int signum, sighandler_t handler); 第一参数是信号 第二个参数是信号处理器:             1.可以是SIG_DFL,信号的默认动作             2. 可以是SIG_IGN,忽略该信号             3. 一个带有一个整型参数的处理函数. #include <signal.h> int sigacti

信号处理函数的返回sigsetjmp/siglongjmp

由于在信号处理期间自动屏蔽了正在被处理的信号,而使用setjmp/longjmp跳出信号处理程序时又不会自动将 信号屏蔽码修改会原来的屏蔽码,从而引起该信号被永久屏蔽. 可以使用sigsetjmp/siglongjmp来解决这一问题. int sigsetjmp(sigjmp_buf env, int savesigs); void siglongjmp(sigjmp_buf env, int val); 如果savesigs非0,则sigsetjmp在env中保存进程的当前信号屏蔽字,在调用s

【系统篇】从C/C++语言到进程启动背后的故事

我们需要运行一个程序或者软件,双击之即可完成.不过从你双击到程序的窗口产生的这“短暂”的时间内,Windows为你做了很多的工作. 首先,系统有一个进程监测到了你的双击操作,这个进程就是系统shell,没错,就是资源管理器explorer.exe,不是IE浏览器了,那是另一个进程IExplorer.exe.你可以尝试打开任务管理器将这个进程结束掉,然后桌面的一切元素都没有了,任务栏,图标什么的都消失了.只剩下墙纸一张,此时,右键菜单也不复存在···因为平时负责这些东西的explorer.exe已

[学习笔记]信号处理函数遇上可重入和不可重入函数

可重入函数概念 q  为了增强程序的稳定性,在信号处理函数中应使用可重入函数. q  所谓可重入函数是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错.因为进程在收到信号后,就将跳转到信号处理函数去接着执行.如果信号处理函数中使用了不可重入函数,那么信号处理函数可能会修改原来进程中不应该被修改的数据,这样进程从信号处理函数中返回接着执行时,可能会出现不可预料的后果.不可再入函数在信号处理函数中被视为不安全函数. q  满足下列条件的函数多数是不可再入的:(1)使用静态的数据结构