如果从二进制

时间:2016-11-23 02:16:39

标签: c linux shell ash

我在这里得到了一个奇怪的东西。我有以下环境。

  • 一个Linux编译的二进制文件,它设置一个信号处理程序来禁用Ctrl + C,Ctrl + z等等。这可以通过调用信号来完成:SIGINT,SITTSTP和SIGQUIT。信号处理程序只是打印一条错误消息,不允许用户中止程序。
  • 设置信号处理程序后,二进制文件将调用交互式灰脚本。
  • 此交互式灰脚本也会禁用所有突破脚本的方法。它通过"陷阱'' INT TSTP"在一开始。这是有效的,如果进入Ctrl + C等,它只是将控制字符回显到终端,但不会退出。

单独的binary和ash脚本都会阻止用户退出。

但请注意以下内容:

  1. 通过正常完成交互式shell脚本,允许控制返回到二进制文件。一旦控件返回到二进制文件,输入Ctrl + C就可以了,并且不允许用户退出程序。 这是正确的行为
  2. 错误的地方是:

    1. 在交互式shell脚本运行期间键入几个Ctrl + C'一旦控件返回到二进制文件,退出代码将更改为shell脚本正在执行的操作之外的其他内容。
    2. 以下是一个例子:

      在C代码中,我们说我有:

      void sigintHandler(int sig_num)
      {
          fprintf(stderr, "You are not allowed to exit this program.\n");
          return;
      }
      void main(void)
      {
          signal(SIGINT, sigintHandler);
          int ret = system("/etc/scripts/test.sh");
          printf("test.sh returned: %d exit status.\n", ret);
      }
      

      在test.sh中我有:

      #!/bin/ash
      # Disable interrupts so that one cannot exit shell script.
      trap '' INT TSTP
      echo -n "Do you want to create abc file? (y/n): "
      read answer
      if [ $answer == "y" ];then
          touch /tmp/abc
      fi
      if [ -f /tmp/abc ]; then
          echo "Returning 1"
          exit 1
      else
          echo "Returning 2"
          exit 2
      fi
      

      如果我正常运行C二进制文件,我将获得正确的退出状态(1或2),具体取决于文件是否存在。实际上我得到256或512表示它将退出代码存储在第二个字节中。点是每次都能保持一致。

      但现在如果我在shell脚本运行时按下Ctrl + C(在回答提出的问题之前)并说我回答" n"这是退出代码2.在C二进制文件中,我得到的代码有时是2(不是512,表示退出代码现在在LOWER字节中)但更常见的是我得到的代码为0!即使我看到消息"返回2"这是由shell脚本回应的。

      这让我疯狂地想弄清楚为什么简单的退出代码被搞砸了。

      任何人都可以提供一些建议吗?

      非常感谢 阿伦

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。

以前我使用陷阱''INT TSTP来禁用shell脚本中的中断。虽然这可以防止shell脚本被中止,但这导致了这篇文章中的问题。我怀疑在禁用以这种方式中止shell脚本的能力时,上层shell框架并没有意识到这一点,并且所有它知道的是Ctrl + C或其他什么被按下并返回SIGINT作为退出代码尽管shell脚本本身正在退出。

解决方案是使用:

stty -isig

在shell脚本的开头。

这不仅禁用了中断,而且让上级框架知道这就是你所做的,这样就忽略了按下Ctrl + C的事实。

我在下页找到了这些信息:

https://unix.stackexchange.com/questions/80975/preventing-propagation-of-sigint-to-parent-process

谢谢大家, 阿伦