Linux端末のバックグラウンドでプログラムがStoppedされた原因と解決

979 ワード

一、問題及び原因
デバイスのために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を送信し、このバックグラウンドプログラムを停止し、ユーザーに通知を送信する」と説明している.
二、解決策
  • プログラムにおいて、リード端末の関連コードを除去する.
  • リダイレクト、./AP_Connect
  • nohup,nohup./AP_Connect&,nohupはプログラムの入力を無視し,出力をnohupに追加する.out.