2011-09-12 13 views
4

QtのstartDetached()の仕組みを誤解しているかもしれませんが、リモートランチャーとして機能するアプリケーションがあるところで問題が発生しています。Qtで独立したプロセスを開始してポートを扱う

ランチャーは、startDetachedを使用してプロセスを開始します。これは、ランチャーアプリを新しいプロセスから完全に分離すると考えていました。しかし、ランチャーが利用している港で何か怪しげなことが起きている。スポーンされたプロセスは、ネットワークコードを使用していないにもかかわらず、同じポートでリッスンしているようです。

問題は、ランチャープロセスを終了するときに発生します。なぜなら、起動されたプロセスは、ランチャーが開始しようとしているポートをまだ使用しているように見えるため、再起動できません。

私の質問は、間違っていますか?リモートエージェントが自分自身をポートに接続しないプロセスを起動するためのより良い方法はありますか?

これはLinux環境です。

EDIT:Qt Bug私はそのバグ修正を採用し、Qtを再コンパイルしました。仕事に見えました!

答えて

1

that bug reportによると、Qt(QFile、QTcpSocket ...)で開かれたファイルとソケットのディスクリプタはすべて子プロセスと共有されないようにFD_CLOEXECというフラグが立てられています。

Qtを使わずにソケットを開いている場合は、同じことを行う必要があります。

編集

私はICEフレームワークとソケットを開封しております。

あなたは可能性:

  • 可能な場合は、Ice/cpp/src/Ice/Network.cppから機能createSocket内の同じリンクの最初の行を挿入するだけでライン/* please don't do this */の下、how to set close-on-exec by defaultに与えられたループを試す、または
  • ICEソースコードを変更して(GPLライセンスを使用している場合は変更を再配布する)、
  • daemonizeのようなラッパープロセスを使用して、ruの前にすべての記述子を閉じます実際の子プロセスは です。
    はたぶん次のコードのような単純な何かあまりにもうまくいくかもしれない(それがコンパイルされ、正常に動作が、私は開いたソケットでそれをテストしていない):

    #include <unistd.h> 
    #include <iostream> 
    #include <cstring> 
    #include <cerrno> 
    
    int main(int argc, char**argv) 
    { 
        // close all descriptors except stdout/stdin/stderr 
        int maxfd = sysconf(_SC_OPEN_MAX); 
        for(int fd = 3; fd < maxfd; fd++) 
         close(fd); 
    
        // pass all the program arguments except the wrapper name 
        execve(argv[1], &argv[1], environ); 
    
        // exec() only returns if an error occurred 
        std::cerr << strerror(errno) << std::endl; 
        return 1; 
    } 
    
+0

私はICEフレームワークとソケットを開封しております。面白い。 – Robb

+0

@Robb私は可能な解決策のために私の答えを編集しました。 – alexisdm

+0

これは基本的に解決策でしたが、私は別のアプローチを行っていました。 – Robb

関連する問題