我应该覆盖Ctrl``C
信号并使用它来打印消息。它不应该结束程序。
到目前为止,所发生的是,当Ctrl``C
按下它时,它会打印消息,但会结束程序。
当我问我的教授时,他告诉我要这样做:您需要使信号处理程序不要继续处理信号。现在,信号正在由您的代码处理,然后转到父处理程序。
我应该添加一种方法还是需要将信号安装程序移动到某个地方?
到目前为止,这是我的代码:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
#include "Input.h"
#include "CircleBuff.h"
//void handler_function(int signal_id);
void catch_int(int sig_num){
//reset the signal handler again to catch_int, for next time
signal(SIGINT, catch_int);
//print message
printf("Print History");
fflush(stdout);
}
void printHistory(CircleBuff hist){
cout << "Complete History:\n" << endl;
hist.print();
cout << endl;
}
int main(int argc, char** argv){
struct sigaction signal_action; /* define table */
signal_action.sa_handler = catch_int; /* insert handler function */
signal_action.sa_flags = 0; /* init the flags field */
sigemptyset( &signal_action.sa_mask ); /* are no masked interrupts */
sigaction( SIGINT, &signal_action, NULL ); /* install the signal_action */
do{
//My code: where the value report will be assigned within.
} while(report != 1)
}
哇, 方式 太多的代码去筛选。但是,如果使用C标准库,则应获得所需的行为。这是C ++版本:
#include <iostream>
#include <csignal>
sig_atomic_t sigflag = 0;
void sighandler(int s)
{
// std::cerr << "Caught signal " << s << ".\n"; // this is undefined behaviour
sigflag = 1; // something like that
}
int main()
{
std::signal(SIGINT, sighandler);
// ... your program here ...
// example: baby's first loop (Ctrl-D to end)
char c;
while (std::cin >> c)
{
if (sigflag != 0) { std::cerr << "Signal!\n"; sigflag = 0; }
}
}
这将捕获Ctrl-C
(引发SIGINT
),并且信号处理程序不会被替换,因此它将每次触发,并且没有人终止程序。
请注意,信号处理程序由fork()
ed子级继承。
Posix函数sigaction()
使您可以注册一次调用的“一次性”处理程序,这些处理程序将由标准处理程序替换。但是,这是更高级且特定于Posix的。
编辑: 正如@Dietrich指出的那样,您永远不应 在 信号处理程序 内
做任何实际工作。相反,您应该设置一个标志(我提供了一个示例),并在循环中检查该标志(并在其中打印消息)。我也将修改示例。
我正在开发一个Spring集成/引导应用程序。我正在使用一个多文档(src/main/Resources/application.yml)来设置几个配置类的默认值(用@ConfigurationProperties注释)。pplicaiton.yml带有默认值,其中一些需要被覆盖,具体取决于环境。 我可以在目录中使用Java系统属性(-D...=...)、Spring“属性”(--...=...)
我正在尝试与c面板一起运行NGINX Web服务器。我已经启动并运行了NGINX,并且该站点运行良好,但在安装cPel后,看起来它覆盖了PHP。 错误日志中的当前错误: connect() 连接到上游时失败(111:连接被拒绝) 此错误表明FastCGI或php-fpm存在问题。当我尝试重新启动php-fpm服务时,我得到了以下错误: 启动php-fpm:[23-Aug-2013 00:30:31
问题内容: 我们很少有扩展基本类的类。我们注意到我们使用了“退出一些睡眠”方法,并且希望在发生睡眠时进行记录。有没有一种方法可以覆盖Thread.sleep方法,在其中我可以添加一些自定义逻辑(即记录),然后仅调用实际的Thread.sleep()?这样,我就不必更改在我的基类中使用Thread.sleep的所有位置。我也愿意接受其他选择。 问题答案: 您不能重写方法,因为它是本机方法,所以无法对
问题内容: 我试图在php中覆盖我的位置,但是我仍然在php.ini文件中获得了2 mb的值。 问题答案: 通过进行设置时,这些设置不会有任何效果。 原因是PHP 在 执行脚本 之前 需要这些值。上载时,将在完成上载后执行目标脚本,因此PHP需要事先知道最大大小。 在,虚拟主机配置或文件中进行设置。一个典型的文件如下所示:
问题内容: 我的Java应用程序引用了一个使用log4j日志记录的第三方jar文件。问题是该jar包含自己的log4j.properties文件,这会导致我的机器上的访问被拒绝的异常,但是我无法控制jar文件来更改其内容。 我尝试在应用程序的类路径中添加自己的log4j.properties文件,但似乎没有效果。如果我尝试使用PropertyConfigurator以编程方式导入自己的设置,则lo
在上一章中,我们讨论了超类和子类。 如果一个类从其超类继承一个方法,那么只要它没有标记为final,就有可能覆盖该方法。 覆盖的好处是:能够定义特定于子类类型的行为,这意味着子类可以根据其需求实现父类方法。 在面向对象的术语中,覆盖意味着覆盖现有方法的功能。 例子 (Example) 我们来看一个例子。 class Animal { public void move() { Sy