Chinaunix

标题: SIGKILL 和 SIGSTOP 信号不能被捕捉的问题? [打印本页]

作者: 老爷康    时间: 2016-07-18 09:41
标题: SIGKILL 和 SIGSTOP 信号不能被捕捉的问题?
环境:linux
现在有一个需求,我程序启动后,为了防止用户误输入ctrl+D/C 而把任务给挂掉,想忽略或者捕捉这个信号,当然,ctrl+c发送中断信号,可以被忽略,但是
类似于SIGKILL 和 SIGSTOP 信号不能被捕捉也不能被捕获我该怎么办,我想禁用掉他们,求解决
作者: 老爷康    时间: 2016-07-18 09:42
打字错误。不是D,是Zlol
作者: cokeboL    时间: 2016-07-18 10:53
别逗,如果这俩都能捕捉了,恶意程序你就杀不掉了。
作者: cokeboL    时间: 2016-07-18 10:55
程序员最大的错误之一就是,什么问题都想用技术解决,有时候是需求有问题,技术是解决不了的。
作者: 老爷康    时间: 2016-07-18 11:04
回复 4# cokeboL

那我说的简单点吧,现在要基于linux的原有shell 用python实现一个命令台,不想用户ctrl+Z 给退出,也就是用户只能看到我提供的命令台,看不到原有的shell  怎么办
我们使用的bash,你按下ctrl+D 不是也不会退出吗,
   
作者: cokeboL    时间: 2016-07-18 11:09
回复 5# 老爷康


程序员最大的错误之一就是,什么问题都想用技术解决,有时候是需求有问题,技术是解决不了的。

这句能看懂不。。
作者: gaojl0728    时间: 2016-07-18 11:51
linux 内核设计就是这两个信号不能被捕获
作者: nswcfd    时间: 2016-07-18 14:21
在bash里同样可以通过kill命令把自己杀掉的,只要python console不给用户提供执行kill的机会不就没事了?

“我们使用的bash,你按下ctrl+D 不是也不会退出吗,”
应该会退出吧?^D

作者: 老爷康    时间: 2016-07-18 14:39
自己解决一下自己的问题:
问题描述:要在python程序中防止用户退出  经过多方查找和实践,发现是自己的问题   ^C ^Z ^\ 这三个都会导致退出,但是我们需要知道他们触发的信号
和那两个不可忽略的信号并没有关系,是我自己提出的问题 有毛病 , 分别是 SIGTSTP SIGINT SIGQUIT 只需要调用python的signal库,对这三个
信号 屏蔽即可
import signal
signal.signal(signal.SIGINT,signal.SIG_IGN).其他两个类似,即可!!!
作者: seanking1987    时间: 2016-07-18 15:54
大家都被带到信号9的坑里了。。
作者: MMMIX    时间: 2016-07-18 19:37
回复 5# 老爷康


    你选错方法实现这个需求了。
作者: MMMIX    时间: 2016-07-18 19:39
seanking1987 发表于 2016-07-18 15:54
大家都被带到信号9的坑里了。。


确实,这就是个标准的x-y问题。
作者: windoze    时间: 2016-07-18 23:22
给你几个方案:
1、写个内核模块,禁掉指定进程的SIGSTOP和SIGKILL,还别说,很多恶意软件就是这么干的。
2、给系统换个root密码,然后用root权限启动你的程序,这样所有其它用户就没权限给你的进程发信号了
3、干掉产品经理,把现场伪装成事故,如此反复直到换上一个不会提这种傻逼需求的产品经理。
作者: cjfeii    时间: 2016-07-21 18:04
  1. static void stop(int sig)
  2. {
  3.     switch(sig) {
  4.         case SIGTERM:   /* kill. */
  5.             printf("receive signal: SIGTERM");
  6.             break;
  7.         case SIGINT:    /* Ctrl-C. */
  8.             printf("receive signal: SIGINT");
  9.             break;
  10.         case SIGUSR1:   /* user defined signal. */
  11.             printf("receive signal: SIGUSR1");
  12.             break;
  13.         default:        /* -1: unexpected. */
  14.             printf("receive signal: unexpected signal");
  15.             break;
  16.     }
  17. }

  18. static void reg_signals()
  19. {
  20.     signal(SIGINT, stop);    // Ctrl-C
  21.     signal(SIGTERM, stop);   // kill
  22.     signal(SIGUSR1, stop);   // user defined signal.
  23. }
复制代码
可以用上面的方式捕捉对应的signal




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2