3

私は少し問題があります。私はプログラム、サーバーの役割を書き、クライアントの要求を待つ無限ループを実行しました。
しかし、私はこのプログラムにも彼のpidを返してもらいたいと思います。
したがって、マルチスレッドを使用する必要があると思います。
これが私のメインです:

int main(int argc, char **argv) {

    int pid = (int) getpid();
    int port = 5555

    ServerSoap *servsoap;
    servsoap = new ServerSoap(port, false);
    servsoap->StartServer(); //Here starts the infinite loop

    return pid; //so it never executes this
}

bashスクリプトの場合は&、バックグラウンドで実行するために追加します。
pthreadを使用しますか?そして、それをどのように行うのですか?

ありがとう。
eo

4

4 に答える 4

4

プログラムが戻る(終了する)と、実行中のすべてのスレッドが終了するため、バックグラウンドスレッドを実行し続けることはできません。

さらに、のint戻り値mainは(通常)7ビット値に切り捨てられるため、完全なpidを返すのに十分なスペースがありません。

を使用してpidをstdoutに出力する方がよいでしょうprintf

于 2012-07-13T07:44:49.267 に答える
1

デーモンを実装しようとしているような気がします。

@ecatmurの回答に追加するには、エラーが発生していない場合、プログラムは終了時に常に0を返す必要があります。

PIDは通常、いくつかのファイルに保存されます。多くの場合、/ var /run/ディレクトリに保存されます。一部のプログラムは/tmp/ディレクトリを使用します。

于 2012-07-13T07:47:24.167 に答える
1

無限ループを別のスレッドに入れてから戻るとmain、新しいスレッドを含むプロセス全体が強制終了されます。スレッドを維持する1つの解決策は、切り離されたスレッドを作成することです。より良い解決策は、おそらく新しいプロセスを作成することです。

int main()
{
    int pid = fork();
    if (pid == -1)
        perror("fork");
    else if (pid == 0)
    {
        ServerSoap serversoap(5555, false);
        serversoap.StartServer();
    }

    return pid;
}

編集:main ecatmurからの回答に記載されているように、からの戻り値の制限にも注意してください。

于 2012-07-13T07:48:29.347 に答える
0

あなたのメインはあなたのサーバーがすべきことをやろうとしています。ここでいくつかのパターンを混乱させています。

パターン#1:デーモン

mainは、オンのときにクライアント要求を受け入れ、それらを使用して操作を実行するプログラムと考えてください。これがプログラムの構造である場合、メインはリクエストを待機する必要があります。リクエストを受信した場合にのみ、リクエストされた操作を実行します。メインは、このサービスをオンまたはオフにするためだけに機能します。通常、このタイプの動作はデフォルトでスレッドで処理されます。リスナーは、たとえば、リクエストに関する情報を使用して特定のメソッドを呼び出すスレッドをアクティブにします。実行する必要のある作業にスレッドが必要でない限り、このためのスレッドは必要ありません。

パターン#2:ツール

または、このプログラムをツールとして呼び出すこともできます。それでもWebサービスが必要ですが、このプログラムはそれとは別のものである可能性があります。ツールが行うべきことは別として、これにスレッドを必要とすべきではありません。

どちらの場合でも、あなたが探しているのはスレッド化を実装することではないと思います。何もしないサーバーをアクティブ化するだけです。代わりに、リクエストハンドラの追加を検討する必要があります。

于 2012-07-13T07:51:44.723 に答える