linux ctrl+c无法中断?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux ctrl+c无法中断?相关的知识,希望对你有一定的参考价值。

代码:# include<stdio.h># include<signal.h># include<unistd.h># include<stdlib.h>void waiting();void stop();int wait_mark;main() int p1, p2;signal(SIGINT,stop);while((p1=fork())==-1);if(p1>0) while((p2=fork())==-1);if(p2>0) wait_mark=1;waiting(0);kill(p1,10);kill(p2,12);wait();wait();printf("parent process is killed!\n");exit(0);elsewait_mark=1;signal(12,stop);waiting();lockf(1,0,0);exit(0);elsewait_mark=1;signal(10,stop);waiting();lockf(1,1,0);printf("child process 1 is killed by parent!\n");lockf(1,0,0);exit(0);void waiting()while(wait_mark!=0);void stop()wait_mark=0;

如果是进程的话,ctrl z切到后台,用kill 9杀死。
kill 9是无法hook的。
你这种情况应该是输入exit来logout吧追问

为什么没有输出信息呢?

参考技术A 已经终端了,想退出shell按ctrl+d追问

那为什么没有输出信息呢?

追答

你程序没输出

Linux 中的 Ctrl + C 中断事件处理

【中文标题】Linux 中的 Ctrl + C 中断事件处理【英文标题】:Ctrl + C interrupt event handling in Linux 【发布时间】:2013-07-19 22:43:33 【问题描述】:

我正在开发一个使用 C++ 并使用 Linux GNU C 编译器编译的应用程序。

当用户使用 Ctrl + C 键中断脚本时,我想调用一个函数。

我该怎么办?任何答案将不胜感激。

【问题讨论】:

您需要Defining Signal Handlers 用于SIGINT,从this code 获得想法 这和使用的编译器有什么关系? @mozcelikors 没有“GCC 认可的库”之类的东西。如果有一个用标准 C 编写的库,任何理智的 C 编译器都应该能够编译它。 Grijesh,你能给我举个例子吗?我只需要定义一个kill事件,但我没有任何想法。 Handling Ctrl-C in a Linux TCP/IP Server written in C的可能重复 【参考方案1】:

当你按下 Ctr + C 时,操作系统会向进程发送一个signal。有很多信号,其中之一是 SIGINT。 SIGINT(“程序中断”)是终止信号之一。

还有更多种类的终止信号,但关于 SIGINT 的有趣之处在于它可以被您的程序处理(捕获)。 SIGINT 的默认操作是程序终止。也就是说,如果您的程序没有专门处理此信号,则当您按 Ctr + C 时,您的程序将作为默认操作终止。

要更改信号的默认操作,您必须注册要捕获的信号。在 C 程序中注册一个信号(至少在 POSIX 系统下)有两个函数

    signal(int signum, sighandler_t handler); sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);。

这些函数要求标头 signal.h 包含在您的 C 代码中。我在下面用 cmets 提供了一个简单的 signal 函数示例。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h> //  our new library 
volatile sig_atomic_t flag = 0;
void my_function(int sig) // can be called asynchronously
  flag = 1; // set flag


int main()
  // Register signals 
  signal(SIGINT, my_function); 
  //      ^          ^
  //  Which-Signal   |-- which user defined function registered
  while(1)  
    if(flag) // my action when signal set it 1
        printf("\n Signal caught!\n");
        printf("\n default action it not termination!\n");
        flag = 0;
         
  return 0;
  

注意:您应该只在信号处理程序中调用safe/authorized functions。例如avoid calling printf in signal handler。

您可以使用 gcc 编译此代码并从 shell 执行它。代码中有一个无限循环,它将一直运行,直到您按 Ctr + C 发送SIGINT 信号。

【讨论】:

你可以把cmets留给你的疑惑,我只是试着给你一个快速的开始点。我相信通过更多的努力,您将详细探索这些东西。 我很确定该进程发送了一个信号,而不是一个信号。 :-) @Duck 嘿鸭子谢谢你!我的英语很差,我仔细注意到你的编辑,并开始了解我的错误。我会改进它。谢谢! @mozcelikors 记得the library resets the signal so that the default action is performed if the same signal occurs again @Grijesh Chauhan,你很受欢迎,但你的英语并不差。我只是填补了一些漏洞。【参考方案2】:

键入 CtrlC 通常会导致 shell 将 SIGINT 发送到您的程序。为该信号添加一个处理程序(通过signal(2)sigaction(2)),当按下 CtrlC 时,您可以做任何您想做的事情。

或者,如果您只关心在程序退出之前进行清理,则通过atexit(3) 设置退出处理程序可能更合适。

【讨论】:

atexit() 不是替代方案,因为以这种方式注册的函数不会在程序由于信号而存在时被调用。【参考方案3】:

您可以使用信号宏。

这是一个如何处理它的例子:

#include <signal.h>
#include <stdio.h>
void sigint(int a)

    printf("^C caught\n");

int main()

    signal(SIGINT, sigint);
    for (;;) 

样本输出:

Ethans-MacBook-Pro:~ phyrrus9$ ./a.out
^C^C caught
^C^C caught
^C^C caught
^C^C caught
^C^C caught

【讨论】:

避免在信号处理程序中使用 printf 就这么简单。我用它来关闭 i2c 连接,因此 printf 将替换为连接终止功能。真的谢谢。

以上是关于linux ctrl+c无法中断?的主要内容,如果未能解决你的问题,请参考以下文章

Linux 安装VMware Tool时,中断后无法安装

Linux Ctrl+c与ctrl+z的区别

Linux后台进程管理以及ctrl+z(挂起)ctrl+c(中断)ctrl+(退出)和ctrl+d(EOF)的区别(转)

linux ctrl+c,ctrl+z,ctrl+d

Linux中ctrl+z ctrl+c ctrl+d区别

ctrl+c,ctrl+d,ctrl+z在linux程序中意义和区别