グッドデザイン賞を受賞したウォーターサーバー >>

以下の方法を調べていますが、プロセスIDからウィンドウハンドルを取得する方法がわかりませんでした。

(1)自分がCreateProcessで生成したプロセスのウィンドウハンドル

(2)自分とは関係ないプロセスで、プロセスIDだけ判明しているプロセスのウィンドウハンドル

ご存知の方、ご教授願います。

<環境>
WindowsXP
VC++6.0

このQ&Aに関連する最新のQ&A

A 回答 (1件)

(1)も(2)も一緒です。



1.EnumWindowsでトップレベルウィンドウを列挙
2.GetWindowThreadProcessIdでプロセスIDを取得
3.プロセスIDが同一だったらEnumChildWindowsで子ウィンドウを列挙
    • good
    • 1
この回答へのお礼

ありがとうございます。
大変参考になりました。

お礼日時:2003/06/17 21:55

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qウィンドウのタイトルからプロセス取得

VB6です。
どのようなAPIを使っていけばよいなど、教えてもらえたらありがたいです。

Aベストアンサー

どうも。

この辺りのものが使える関数一覧で、
http://www.winapi-database.com/Program/Process/index.html

だいたいこんな感じになると思います(未検証です)

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpszClassName As String, ByVal lpszWindowName As String) As Long
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, ByRef lpdwProcessId As Long) As Long

Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Const PROCESS_VM_READ As Long = &H10

Function GetWindowProcess(ByVal Title As String) As Long
'ウインドウ名からプロセスハンドルを取得する
Dim hWnd As Long
Dim PID As Long
Dim hProcess
hWnd = FindWindow(Title, vbNullString)
If hWnd = 0 Then Exit Function

'ウィンドウハンドルからプロセスハンドルを取得
Call GetWindowThreadProcessId(hWnd, PID)
hProcess = OpenProcess(PROCESS_VM_READ, 0, PID)

GetWindowProcess = hProcess

End Function

どうも。

この辺りのものが使える関数一覧で、
http://www.winapi-database.com/Program/Process/index.html

だいたいこんな感じになると思います(未検証です)

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpszClassName As String, ByVal lpszWindowName As String) As Long
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, ByRef lpdwProcessId As Long) As Long

Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAcces...続きを読む

QFindWindowの戻り値が違う!?

いつもお世話になっております。
FindWindowの戻り値についてご教授願います。

ret = FindWindow(NULL,"sample");
上記を実行した場合、取得する画面がアクティブの時と非アクティブの時でFindWindowの戻り値が違うのは何故でしょうか?

私は、sample画面が非アクティブでもアクティブ状態の時と同じハンドルが取得したのですが、良い方法は有りますでしょうか?

取得画面タイトル:sample
実行ファイル名:sample.exe

実行環境:WindowsXP
開発環境:VC++ 6.0

Aベストアンサー

No.1, No.2 への補足読みました。

VC++ に付属の Spy++ というツールを使うと,任意のウィンドウのウィンドウクラス名を調べることができます。
使い方は参考 URL を。

これで調べたウィンドウクラス名を,FindWindow の第1引数に渡してやればよいです。

ただし,ウィンドウクラス名は一意ではないので,確実に目的のウィンドウのハンドルが取れる保証はありません。
要は仕様でどこまで要求されるかですが,それじゃ困るという場合には別な方法を考えないといけませんね,ということで。

参考URL:http://www.microsoft.com/japan/developer/library/vcug/_asug_using_the_window_finder_tool.htm

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

QEnumWindowsのコールバック関数

現在起動している、ウィンドのタイトルを取得したくて1週間前からプログラミングを始めました。

web上のサンプルコードを切った貼ったして、なんとかウィンドタイトルの取得まで漕ぎ着けたのですが、
EnumWindowsのコールバック関数で取得した文字列を呼び出し側で使うにはどうすればですか?
ウィンドとか要らないですただ、取得した文字列をメッセージボックス
に表示して、クリップボードに貼り付けたいだけです。

Aベストアンサー

#include <stdio.h>
#include <Windows.h>

// 定数
#define SW_TITLE (1) // タイトルバーの取得
#define SW_CLASS (2) // クラス名の取得

// 独自の構造体を宣言
typedef struct enum_param_t {
 LPTSTR lpBuff;   // 先頭ポインタ位置
 LPTSTR lpTail;   // 現在ポインタ位置
 LPTSTR lpStop;   // 最終ポインタ位置
 UINT swOption;  // 汎用オプション値
} enum_param_t;

// ウインドウのふるいにかける処理
BOOL MyIsTopWindow( HWND hWnd, LPTSTR lpTitle, LPTSTR lpClass )
{
 if ( IsWindowVisible(hWnd) ){        // 可視状態か
  if ( GetWindow(hWnd,GW_OWNER) == NULL ){    // トップレベルウィンドウか
   if ( lstrlen(lpTitle) > 0 ){      // キャプションを持っているか
    if ( lstrcmp(lpClass,TEXT("Progman")) != 0 ){ // シェルでないか
     return TRUE;
    }
   }
  }
 }
 return FALSE;
}

// ちょっとだけ書き換えました。
BOOL CALLBACK EnumWndProc( HWND hWnd, LPARAM lParam )
{
 enum_param_t *p = (enum_param_t *)lParam;  // ここで構造体を受け取る
 TCHAR szWindowName[ 128 ];
 TCHAR szClassName[ 128 ];
 
 //ウィンドウテキストの取得
 GetWindowText( hWnd, szWindowName, sizeof(szWindowName) );
 //ウィンドウクラス名の取得
 GetClassName( hWnd, szClassName, sizeof(szClassName) );
 
 // 取得した情報を文字列に取得
 if ( MyIsTopWindow(hWnd,szWindowName,szClassName) ){
  LPTSTR lpBuff;
  
  // ここで swOption で処理分岐
  switch ( p->swOption ){
   case SW_TITLE: lpBuff = szWindowName; break; // タイトルバーの取得
   case SW_CLASS: lpBuff = szClassName; break; // クラス名の取得
   default: return TRUE;
  }
  // バッファの残り容量をチェック
  if ( (p->lpTail + lstrlen(lpBuff) + 1) < p->lpStop ){
   p->lpTail += wsprintf( p->lpTail, TEXT("%s\n"), lpBuff );
  }
 }
 return TRUE;
}

// 文字列をクリップボードにコピー
BOOL MyClipboardCopy( HWND hWnd, LPCTSTR lpText )
{
 HGLOBAL hMem; // 設定用のメモリ変数
 LPTSTR lpBuff; // 複写用のポインタ
 DWORD dwSize; // 複写元の長さ
 
 // クリップボードのデータ内容
 dwSize = (lstrlen(lpText) + 1); // '\0' 文字分を加算
 
 // データ内容のメモリを確保
 if ( (hMem = GlobalAlloc((GHND|GMEM_SHARE),dwSize)) != NULL ){
  if ( (lpBuff = (LPTSTR)GlobalLock(hMem)) != NULL ){
   // ここでテキストデータを lpBuff にコピー
   lstrcpy( lpBuff, lpText );
   GlobalUnlock( hMem );
   
   // クリップボードにデータを設定
   if ( OpenClipboard(hWnd) ){
    EmptyClipboard();
    SetClipboardData( CF_TEXT, hMem );
    CloseClipboard();
    return TRUE;
   }
  }
  GlobalFree( hMem ); // ロックできない時は解放
 }
 return FALSE;
}

// メイン関数
int main( void )
{
 TCHAR szText[ 32 * 1024 ]; // タイトルバー(32 KB)
 enum_param_t prm; // 構造体を宣言
 
 // 構造体の初期化
 prm.lpBuff  = szText;
 prm.lpTail  = szText; // ここが書き込み位置
 prm.lpStop  = szText + sizeof( szText );
 prm.swOption = SW_TITLE; // 機能拡張用のオプション(自由に値をセット)
 
 // ウインドウの列挙開始
 EnumWindows( EnumWndProc, (LPARAM)&prm );
 
 // 特に必要がないなら削除(printf() でも文字列として表示可能)
 MessageBox( NULL, szText, "起動中のWindow", MB_OK );
 
 // クリップボードにコピー
 if ( !MyClipboardCopy(NULL,szText) ){
  printf( "クリップボードにコピーできませんでした。\n" );
 }
 return 0;
}
以上。

#include <stdio.h>
#include <Windows.h>

// 定数
#define SW_TITLE (1) // タイトルバーの取得
#define SW_CLASS (2) // クラス名の取得

// 独自の構造体を宣言
typedef struct enum_param_t {
 LPTSTR lpBuff;   // 先頭ポインタ位置
 LPTSTR lpTail;   // 現在ポインタ位置
 LPTSTR lpStop;   // 最終ポインタ位置
 UINT swOption;  // 汎用オプション値
} enum_param_t;

// ウインドウのふるいにかける処理
BOOL MyIsTopWindow( HWND hWnd, LPTSTR lpTitle, LPTSTR ...続きを読む

QVC++から引数付きexeファイルの実行

タイトルの通り、VC++から外部ファイルを実行したいのですがどのような関数を使えばよいのでしょうか?
exeファイルを実行中は親プロセスであるVCのプログラムの方を止めておきたいのです。
出来ればexeファイルは引数付きで実行したいと思いますので、よろしくお願いします。
開発環境はVisualStudio2005です。

Aベストアンサー

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
printf("ARGV[%d]=%s\n",i,argv[i]);
}
return 0;
}
以下、実行結果です。
コマンドプロンプト画面に下記の文字が出力されます。
------------------------
system試験開始
ARGV[0]=C:\VCSTUDY\printarg\Debug\printarg.exe
ARGV[1]=XXX
ARGV[2]=YYY
ARGV[3]=ZZZ
system成功
Press any key to continue
---------------------------

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
p...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qプロセスハンドル or ウインドウハンドル ??

こんにちは、E46-M3と申します。
さっそくですが、
あるプログラムから別のアプリケーションを起動させる際
または、終了させる際「ハンドル」を使用しますが、
ハンドルそのものの知識が浅いので
是非わかりやすく教えて頂ければ思います。
また、プロセスハンドルとウインドウハンドルの
違いについても教えて頂ければと思います。
よろしくお願い致します。

Aベストアンサー

 ハンドルについての解説は、それだけでかなりのスペースが必要です。ので、簡単に書きます。
 詳細は、WindowsAPIバイブル等の書籍を購入して読んで来下さい。

 プロセスハンドルは、各アプリケーション内部で発生したプロセスが持つハンドルです。親ハンドルは、アプリケーションのプロセスハンドルにもなります。
 ウィンドウハンドルは、各アプリケーションから作成される窓毎に持つハンドルです。メイン画面のハンドルは、アプリケーションのハンドルとなります。

 別のアプリケーションを起動する場合には、プロセスハンドルが取得できます。しかし、Windowsの終了等には、プロセスハンドルではなく、ウィンドウハンドルが必要になります(ヘルプ読んでね)。

 説明の都合上端折っている所があるので、正確に覚える場合には、書籍の購入を強くお薦めします。

Qウィンドウのハンドルからファイル名を取得について

ウィンドウのハンドルからファイル名を取得する方法について質問です。

GetWindowThreadProcessIdで、スレッドのIDを取得、
OpenProcessで、ハンドルを開く、
EnumProcessModulesで、モジュールのハンドルを取得、
GetModuleFileNameExで、パス名を取得、
でファイル名を取得しようとしているのですが一部のウィンドウのハンドルは失敗します。
Windows XPでは取得できるのですが、Windows 7では失敗します。
EnumProcessModulesで取得が失敗しているようです。
私の予想ではOpenProcessでのアクセス権の指定に問題があるのではと
思って調べてみたのですが分かりませんでした。

GetWindowModuleFileNameでも試してみたのですが、
取得に失敗します。

ちなみに、OpenProcessのアクセスフラグは
「PROCESS_QUERY_INFORMATION | PROCESS_VM_READ」です。

どうすればいいのでしょうか?
他の方法があれば、それでも構いません。
とにかく、他のウィンドウ(プロセス)のファイル名を取得出来れば、
どんな方法でも構いません。
よろしくお願いします。

ウィンドウのハンドルからファイル名を取得する方法について質問です。

GetWindowThreadProcessIdで、スレッドのIDを取得、
OpenProcessで、ハンドルを開く、
EnumProcessModulesで、モジュールのハンドルを取得、
GetModuleFileNameExで、パス名を取得、
でファイル名を取得しようとしているのですが一部のウィンドウのハンドルは失敗します。
Windows XPでは取得できるのですが、Windows 7では失敗します。
EnumProcessModulesで取得が失敗しているようです。
私の予想ではOpenProcessでのアクセス権の指定に問...続きを読む

Aベストアンサー

Windows7 64bit、Visual Studio 2008 Standard、ビルド:x64
で試してみましたが、EnumProcessModules でのエラーはありませんでした。
普通に実行すると OpenProcess でのエラーが 22件となりましたが、「管理者として実行」で実行すると OpenProcess でのエラーは 2件になりました。
「管理者として実行」でも EnumProcessModules でのエラーはありませんでした。


BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam );
void OutputError( HWND hwnd, LPTSTR pMessage );

int _tmain(int argc, _TCHAR* argv[])
{
EnumWindows( EnumWindowsProc, 0 );
return 0;
}

BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam )
{
TCHAR fileName[ MAX_PATH ];
DWORD processID = NULL;
GetWindowThreadProcessId( hwnd, &processID );
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );
if( hProcess ) {
HMODULE hModule = NULL;
DWORD dummy = 0;
if( EnumProcessModules( hProcess, &hModule, sizeof(HMODULE), &dummy ) ) {
memset( fileName, 0, MAX_PATH );
DWORD returnValue = GetModuleFileNameEx( hProcess, hModule, fileName, MAX_PATH );
if( returnValue ) {
_tprintf( _T("%08x:%s\n"), hwnd, fileName );
} else {
OutputError( hwnd, _T("GetModuleFileNameEx") );
}
} else {
OutputError( hwnd, _T("EnumProcessModules") );
}
CloseHandle( hProcess);
} else {
OutputError( hwnd, _T("OpenProcess") );
}
return TRUE;
}

void OutputError( HWND hwnd, LPTSTR pMessage )
{
TCHAR Caption[ 200 ];
DWORD errorCode = GetLastError();
_tprintf( _T("%08x:%s Error:%08x"), hwnd, pMessage, errorCode );
if( GetWindowText( hwnd, Caption, 200 ) ) {
_tprintf( _T(":%s\n"), Caption );
} else {
_tprintf( _T("\n") );
}
}

Windows7 64bit、Visual Studio 2008 Standard、ビルド:x64
で試してみましたが、EnumProcessModules でのエラーはありませんでした。
普通に実行すると OpenProcess でのエラーが 22件となりましたが、「管理者として実行」で実行すると OpenProcess でのエラーは 2件になりました。
「管理者として実行」でも EnumProcessModules でのエラーはありませんでした。


BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam );
void OutputError( HWND hwnd, LPTSTR pMessage );

int _tmain(int argc, _TCHAR...続きを読む

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);

QプロセスIDの取得方法 

Unix C++でプロセスIDの取得方法を教えてください。
(見当違いの質問だったらすみません)
親プロセス(自分)のプロセスIDと、親プロセスの起動した子プロセスのプロセスIDを取得したいです。
また、親プロセスの起動した子プロセスのプロセスIDを使って親プロセス終了時に子プロセスをkillしたいと思うのですが、
具体的にどうすればいいかわからず困っています。

Aベストアンサー

プロセスを殺す処理は kill() を使いましょう、と toysmith さんが
書いてましたね。

  kill(pid_c, SIGTERM);

です。

補足で「sig_handler とは?」とありますが、それはシグナルを処理する
為に書いた関数の名前です(関数名は何でもいい)。

一度、シグナルの処理をしてしまうと、初期状態に戻されてしまうので、
sig_handler() の中でも、signal() を使って、再登録しています。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング