4

これによるとhttp://www.cplusplus.com/reference/clibrary/csignal/signal.html

SIGINT通常、ユーザーによって使用されます。SIGINTc ++でaを引き起こすにはどうすればよいですか? 私は使用例を見ましたkill(pid, SIGINT);が、私はむしろ別の方法でそれを引き起こします. また、私はウィンドウズを使用しています。

4

6 に答える 6

8

C89およびC99は、signal.hでraise()を定義します。

#include <signal.h>

int raise(int sig);

この関数は、呼び出し元のプロセスにシグナルを送信します。これは、

kill(getpid(), sig);

プラットフォームがスレッドをサポートしている場合、呼び出しは次のようになります。

pthread_kill(pthread_self(), sig);

戻り値は、成功した場合は0、それ以外の場合はゼロ以外です。

于 2009-01-27T09:32:28.763 に答える
7

SIGINTを押すと発生しCtrl+Cます。

コード例:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void siginthandler(int param)
{
  printf("User pressed Ctrl+C\n");
  exit(1);
}

int main()
{
  signal(SIGINT, siginthandler);
  while(1);
  return 0;
}

実行時:

$ ./a.out 
^CUser pressed Ctrl+C
$ 

(これは純粋な C コードですが、C++ でも動作するはずです)

SIGINT編集:インタラクティブに押す以外に送信する唯一の方法Ctrl+Cは、あなたが言ったように使用kill(pid, SIGINT)することです...

于 2009-01-27T09:09:12.493 に答える
1

他にどんな方法を考えていますか?このkill()関数は、プログラムによってシグナルを送信するためにカーネルが提供する唯一の方法です。

実際、あなたは Windows を使用していると言いました。kill()Windows には Unix 由来のシステムと同じシグナル アーキテクチャがないため、Windows で何ができるかさえわかりません。Win32 は TerminateProcess 関数を提供しています。コンソール プログラムに適用され、Ctrl+C または Ctrl+Break をシミュレートするGenerateConsoleCtrlEvent関数もあります。

于 2009-01-27T09:03:26.013 に答える
0

この点での「シグナル」は Unix/POSIX の概念です。Windows には、直接同等のものはありません。

于 2009-01-27T09:03:40.180 に答える
0

これはWin32アプリだと思います...

「制御された」または「安全な」終了の場合、アプリがメッセージ ループを使用する場合、その内部から PostQuitMessage API を使用するか、外部で PostMessage API を使用できます。それ以外の場合は、スレッド/プロセス ID を取得し、スレッドのみを強制終了するか、プロセス全体とそれが生成したすべてのスレッドを強制終了するかに応じて、TerminateThread または TerminateProcess API を使用する必要があります。これは、MSDN で Microsoft によって (すべての API 呼び出しと同様に) うまく説明されています。

http://msdn.microsoft.com/en-us/library/aa450927.aspx

于 2009-01-27T14:02:33.460 に答える