Linux端末のバックグラウンドでプログラムがStoppedされた原因と解決
979 ワード
一、問題及び原因
デバイスのためにWIFIの接続性をテストするC++ウィジェットを書いて、デバイスに登録した後に端末でプログラムを実行して、そのバックグラウンドに実行させます:./AP_Connect &
端末はこの情報を印刷します:[1]+停止しました./AP_Connect
次にtopコマンドを使用してプロセスAP_を表示します.Connectの状態がT、すなわちStopped
このセグメントのmain.cpp、以下の通りです.
テスト時にプログラムを簡単に終了するために、メインスレッドに読み取り端末の入力文字を追加し、プロセスを終了するコードを追加します.これもバックグラウンドの実行時にStoppedが発生する理由です.
「Unix環境高度プログラミング」第9.8節作業制御では、「バックグラウンドプログラムが端末を読み取りようとした場合、これはエラーではないが、端末ドライバはこの状況を検出し、バックグラウンドジョブに特定の信号SIGTTINを送信し、このバックグラウンドプログラムを停止し、ユーザーに通知を送信する」と説明している.
二、解決策プログラムにおいて、リード端末の関連コードを除去する. リダイレクト、./AP_Connect nohup,nohup./AP_Connect&,nohupはプログラムの入力を無視し,出力をnohupに追加する.out.
デバイスのためにWIFIの接続性をテストするC++ウィジェットを書いて、デバイスに登録した後に端末でプログラムを実行して、そのバックグラウンドに実行させます:./AP_Connect &
端末はこの情報を印刷します:[1]+停止しました./AP_Connect
次にtopコマンドを使用してプロセスAP_を表示します.Connectの状態がT、すなわちStopped
このセグメントのmain.cpp、以下の通りです.
#include "APConnect.h"
int main(void)
{
auto p = std::make_shared();
p->ConnectToServer();
char ch = 0;
while (1) {
ch = getchar();
if (ch == 'q') {
break;
}
}
return 0;
}
テスト時にプログラムを簡単に終了するために、メインスレッドに読み取り端末の入力文字を追加し、プロセスを終了するコードを追加します.これもバックグラウンドの実行時にStoppedが発生する理由です.
「Unix環境高度プログラミング」第9.8節作業制御では、「バックグラウンドプログラムが端末を読み取りようとした場合、これはエラーではないが、端末ドライバはこの状況を検出し、バックグラウンドジョブに特定の信号SIGTTINを送信し、このバックグラウンドプログラムを停止し、ユーザーに通知を送信する」と説明している.
二、解決策