sigint,为什么Linux设置了SIGINT信号捕捉函数按下CtrlC以后还会结束进程
来源:整理 编辑:智能门户 2024-12-13 02:35:26
本文目录一览
1,为什么Linux设置了SIGINT信号捕捉函数按下CtrlC以后还会结束进程
因为Ctrl+C结束是不能阻止的再看看别人怎么说的。
2,sigint sigterm 有什么区别
1. sigint 信号2. sigtern 禁止/终止信号1. sigint 信号2. sigtern 禁止/终止信号
3,信号情报的种类有哪些
信号情报 sigint迅速简要报道最新文献并指明获取详细资料线索的情报。信号情报只起初步报道的作用,对文...其特点是报道速度快,一般是在收到新文献后及时通知用户。信号出版物的类型有:最新目次页通报、目录通报、目录索引等。像国内的维普 万方 cnki国外的 scifinder sd tri web of science等等
4,windows 怎么发送 sigterm
sigint 信号sigterm 网络终止信号; 警告信号; 信号情报; 正常终止;信号 产生方式 对进程的影响sigint 通过ctrl+c将会对当进程发送此信号 信号被当前进程树接收到,也就是说,不仅当前进程会收到信号,它的子进程也会收到sigterm kill命令不加参数就是发送这个信号 只有当前进程收到信号,子进程不会收到。如果当前进程被kill了,那么它的子进程的父进程将会是init,也就是pid为1的进程
5,Linux信号SIGTERMSIGKILLSIGINT和SIGQUIT的区别
SIGHUP 终止进程 终端线路挂断SIGINT 终止进程 中断进程SIGQUIT 建立CORE文件终止进程,并且生成core文件SIGILL 建立CORE文件 非法指令SIGTRAP 建立CORE文件 跟踪自陷SIGBUS 建立CORE文件 总线错误SIGSEGV 建立CORE文件 段非法错误SIGFPE 建立CORE文件 浮点异常SIGIOT 建立CORE文件 执行I/O自陷SIGKILL 终止进程 杀死进程SIGPIPE 终止进程 向一个没有读进程的管道写数据SIGALARM 终止进程 计时器到时SIGTERM 终止进程 软件终止信号SIGSTOP 停止进程 非终端来的停止信号SIGTSTP 停止进程 终端来的停止信号SIGCONT 忽略信号 继续执行一个停止的进程SIGURG 忽略信号 I/O紧急信号SIGIO 忽略信号 描述符上可以进行I/OSIGCHLD 忽略信号 当子进程停止或退出时通知父进程SIGTTOU 停止进程 后台进程写终端SIGTTIN 停止进程 后台进程读终端SIGXGPU 终止进程 CPU时限超时SIGXFSZ 终止进程 文件长度过长SIGWINCH 忽略信号 窗口大小发生变化SIGPROF 终止进程 统计分布图用计时器到时SIGUSR1 终止进程 用户定义信号1SIGUSR2 终止进程 用户定义信号2SIGVTALRM 终止进程 虚拟计时器到时
6,linux 中的signal 函数
这是个函数指针,void ( *func )( int )是一个接受一个int型参数,不返回的函数的指针;比如:void F( int a ) void ( *func )( int ) = F;func( 3 ); // 调用F函数输出3作为函数参数的函数指针有一个专门的名称叫做回调,你可以把任意满足回调函数参数特征标的函数地址作为参数传给signal。在这里因为signal对于sig参数可以指定用户自定义的信号处理函数,所以你可以把你要处理的这个sig的函数地址作为参数传给signal,那么系统接收到对应sig的时候就会通过你传进去的地址调用你的这个函数。纠正一下: 输出in sig_fun1:30就是第二次调用的时候输出的,第一次调用只是绑定了sigusr1的信号处理函数,不会进入该处理函数 为什么会有这样的输出呢? signal函数是将信号与处理函数进行绑定,成功绑定则返回绑定之前的信号处理函数。那么来看看你的代码,第一次调用将sig_fun1绑定,无输出;第二次调用将sig_fun2绑定,也就是把sig_fun1替换下来,并且你还调用了它,参数为30,所以会有那样的输出。 该如何改呢? 其实你并没有涉及到linux的信号处理机制,光绑定是不够的,还需要发信号给它,才能真正进入信号处理过程。给你一个示例代码吧 #include#include #include #include void sig_fun2(int signo) { printf("in sig_fun2:%d\n", signo); } void sig_fun1(int signo) { printf("in sig_fun1:%d\n", signo); } int main() { unsigned long i; if (signal(sigusr1, sig_fun1) == sig_err) { printf("signal fun1 error\n"); exit(1); } sleep(15); (signal(sigusr1, sig_fun2))(30); sleep(15); printf("done\n"); return 0; } /****************************c 代码完,下面是如何运行***************************/ 首先编译,假设生成可执行程序为test 然后运行,我用的是后台运行: nohup ./test>output.txt & 注意,这种方法要将输出重定向到文件output.txt(名字无所谓),然后你会看到一个数字,就是pid进程号 最后,在15秒之内发送信号:kill -sigusr1 进程号 现在你就可以打开output.txt看输出结果了。如果用sleep的话会被打断,所以只有两个输出加上替换处理函数时的输出共3个,也可以换成 int n=15;while(n--)sleep(1); ------------------------------------------------------------- 怎么样,加分吧 ------------------------------------------------------------- 1.我就是想问第二次绑定sig_fun2的时候,调用了第一次绑定的sig_fun1么? 调用了, (signal(sigusr1, sig_fun2))(30);就是这一句, signal(sigusr1, sig_fun2)是个函数指针,你这样写就是调用它了,但是这和信号处理没关系,写成signal(sigusr1, sig_fun2);就可以了 这就是你所说的成功则返回绑定之前的函数??? 对 那当时绑定sig_fun1的时候,返回之前的处理函数是什么?? 这个就是系统默认的了,比如sigint就是你ctrl+c取消程序执行发送的信号,它的处理函数就是结束程序的一系列动作,不过sigusr1是留给用户自定义的信号,系统默认应该是啥也不做的一个函数,例如void fun(int signo){},你也可以第一次绑定的时候就调用试试看对不对 2.还有我在看signal函数定义的时候,void(//...)(int) 最后传入的这个int整形参数就是我们自定义sig_fun()中所接收的30么??我看例子里面有的signal(sigint,myfunc);也没有带参数啊,搞不懂 是你理解错了,signal函数只是绑定,没涉及到调用绑定函数,不用带参数,信号处理函数不是像你这样调用的。callback回调你知道吧,就是先做好一个函数或过程放着,事件触发的时候才调用。那个30是你用普通函数调用的方式时的参数,跟信号处理一点关系也没有,你用60,70也没半毛钱关系。我猜你是想要调用信号处理函数,然后迷糊了,其实我上面说的“kill -sigusr1 进程号”就是触发程序调用该处理函数的信号,这和kill -9 杀死进程一个道理,只不过处理函数不同,结果不一样。ctrl+c也可以用信号的方式发送,kill -2 进程号,或者 kill -sigint 进程号
文章TAG:
sigint 为什么 什么 linux sigint