[解決済み] WIFSIGNALED()/WTERMSIG()マクロでwaitpid()を使用した後に不具合が発生しました。
2022-02-19 17:01:47
質問
このコードでは、コマンドラインからプログラムを起動し、SIGTERM(正常終了の信号)とは異なる信号で閉じられたら、コマンドラインから渡された最初のプログラムを再立ち上げすることになっています。実際、私の条件"if(WTERMSIG(status)!=SIGTERM)"はうまくいきません。
これが私のコードです。
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char*argv[])
{
pid_t pid;
int* status=(int*)malloc(sizeof(int));
int term;
if(argc<2)
{
printf("Error: Too few arguments\n");
exit(EXIT_FAILURE);
}
while(1)
{
pid=fork();
if(pid!=0) /*father*/
{
waitpid(pid,status,0);
//term=WIFSIGNALED(status);
if(WIFSIGNALED(status))
{
if(WTERMSIG(status)!=SIGTERM)
{
printf("The program %d ended abnormally:\nRelaunching...\n",pid);
sleep(1);
}
else
printf("The program %d is properly terminated...\n",pid);
break;
}
else
{
printf("Can not read the reason for termination\n");
}
}
else /*child*/
{
execvp(argv[1],argv+1);
exit(EXIT_SUCCESS);
}
}
return 1;
}
解決方法は?
その
WIFSIGNALED()
と
WTERMSIG()
マクロは、どちらもプレーンな
int
へのポインタではなく
int
s. つまり、あなたのコードで
status
がint型へのポインタである場合、int型へのポインタは
*status
を呼び出すと、整数の値が渡されます。
とはいえ、なぜ
malloc()
のためのスペースを確保するために、1つの
int
どうせなら、、、?普通に変数を使えばいいし
&status
へのポインタが必要な場合。
また
EXIT_SUCCESS
から
main()
ではなく、プログラムが正常に終了したときに
1
.
関連
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み】strcmpが機能しない
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み] テスト
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み】makefile:4。*** missing separator. 停止する