2

Linuxでg++を使用して次のC++コードをコンパイルすると、正常に動作しますが、実行しようとすると

nohup ./a.out &

情報とともにすぐに停止します

[7]+  Stopped                 nohup ./a.out

ソースコードは次のとおりです。

#include <iostream>
#include <fstream>

using namespace std;

int main(void){

    ofstream file("hm.txt",ios::out | ios::binary | ios::app);
    file << "123";
    file.close();

return 0;
}

私の間違いを指摘してもらえますか?

4

1 に答える 1

0

最初はわかりませんでしたが、システムがプログラムを一時停止(Stopped状態)にすることを決定しているようです。 jobs現在のターミナルセッションで停止または実行されているすべてのジョブを表示します。 bg/fgを使用して停止したジョブを再開できるため、ファイルが書き込まれたかどうかを確認できます。原因をさらに詳しく調べるためのもう1つのアイデアは、を実行すること/usr/bin/nohup strace ./a.out 1>stdout.txt 2>stderr.txtです。はstrace、すべてのシステムコールを-にダンプする必要があります。これにより、システムコールstderr.txtが停止した理由を確認できる場合があります。

このタイプの問題の一般的な原因は、プログラムが何らかの入力nohupを必要とし、それを提供する端末がないため、システムがプログラムを停止することであるように思われます。私の最初の提案は、自動生成された入力を提供するために次のことを試すことでした。

/usr/bin/nohup ./a.out </dev/zero

私のシステムでは、代わりにこれを使用して自動的に実行します。

/usr/bin/nohup ./a.out </dev/null

システムが自動的にnull入力を提供しない理由もわかりません。また、プログラムが入力を待機している理由もわかりません。あなたの最初の試みは私にとってはうまくいきました(私はあなたの問題を再現することはできません)。

nohup ./a.out(または)を実行するとnohup ./a.out &、次のメッセージが表示されます。これは、自動入力抑制を示しています。

nohup: ignoring input and appending output to `nohup.out'

したがって、別の調査行は次のとおりです。このメッセージが表示されないのはなぜですか。


別の攻撃ラインは、システムが気に入らないように思われるためnohup、次のようなバックグラウンドタスクとしてプログラム&を再起動することです。Stopped

/usr/bin/nohup ./a.out & bg

明らかに、nohupと一緒に使用することを意図している&ので、あなたの問題は少し奇妙です。

于 2012-12-16T00:15:42.067 に答える