c++ signal 信号退出

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ signal 信号退出相关的知识,希望对你有一定的参考价值。

signal

函数可以指定退出进程,我们在写服务器程序的时候,需要退出可以按ctrl c,这时候程序可以捕获这个信号,来进行处理退出。

signal(SIGINT, OnCtrlC);

1 主程序退出

在程序外部定义一个quit
quit = 0,当quit == 1 时 代表程序需要退出,写捕获函数

int quit = 0;
void OnCtrlC(int) {
	cout << "ctrl + c" << endl;
	quit = 1;
}

ok,写出主程序如下:

int main(int argc, char* argv[])
{
	signal(SIGINT, OnCtrlC);
	int  i = 0;
	int n = 100;
	//thread th(func, std::ref(n));

	while (true) {
		std::this_thread::sleep_for(std::chrono::milliseconds(200));
		if (quit == 1)
		{
			cout << "quit == 1,out" << endl;
			break;
		}
		cout << ++i << endl;
	}
	th.join();
	//cout << "now the n is " << n << endl;
	cout << "break here" << endl;
	getchar();
	return 0;
}

当按下ctrl +c 时
回车退出
按一个字符退出

线程和主程序同时退出

按照以下程序来写,一个线程和主程序都退出

#include <iostream>
#include <signal.h>
#include <thread>

using namespace std;

int quit = 0;
void OnCtrlC(int) {
	cout <<endl << "ctrl + c" << endl;
	quit = 1;
}

void func(int &n)
{
	while (1)
	{
		if (quit == 1)
			break;
		std::this_thread::sleep_for(std::chrono::milliseconds(200));
		n++;
	}
}
int main(int argc, char* argv[])
{
	signal(SIGINT, OnCtrlC);
	int  i = 0;
	int n = 100;
	thread th(func, std::ref(n));

	while (true) {
		std::this_thread::sleep_for(std::chrono::milliseconds(200));
		if (quit == 1)
		{
			cout << "quit == 1,out" << endl;
			break;
		}
		printf("this is %d\\r", i++);
	}
	th.join();
	cout << "now the n is " << n << endl;
	cout << "break here" << endl;
	getchar();
	return 0;
}

以上是关于c++ signal 信号退出的主要内容,如果未能解决你的问题,请参考以下文章

python signal信号

C++ 信号处理 signal(SIGINT, signalHandler);

为啥 MPI 程序以退出代码 134(信号 6)终止?

Linux信号详解:signal与sigaction函数

Linux信号详解:signal与sigaction函数1

Linux信号详解:signal与sigaction函数1