2011-01-10 5 views
2

私は奇妙な問題があります。私は2つのバイナリがcppという名前であり、もう1つはmnp_proxy_serverです。ポケモンの問題

cppは、メソッドexecuteScriptを呼び出して、mnp_proxy_binaryを開始します。このメソッドのコードは

int executeScript(string script, unsigned int scriptTmOut) 
{ 
fd_set readfd; 
const int BUFSIZE = 1024; 
//stringstream strBuf; 
char buf[ BUFSIZE]; 
time_t startTime = time(NULL); 
struct timeval tv; 
int ret, ret2 = 0; 

FILE * pPipe = popen(script.c_str(), "r"); 
if (pPipe == NULL) 
{ 
//  cout << "popen() failed:"<< strerror(errno) << endl; 
    return -1; 
} 

while(1) 
{ 
    FD_ZERO(&readfd); 
    FD_SET(fileno(pPipe), &readfd); 

    /** Select Timeout Hardcode with 1 secs **/ 
    tv.tv_sec = scriptTmOut; 
    tv.tv_usec = 0; 

    ret = select(fileno(pPipe)+1, &readfd, NULL, NULL, &tv); 
    if(ret < 0) 
    { 
    //   cout << "select() failed " << strerror(errno) << endl; 
    } 
    else if (ret == 0) 
    { 
    //  cout << "select() timeout" << endl; 
     break; 
    } 
    else 
    { 
     //cout << "Data is available now" <<endl; 
     if(FD_ISSET(fileno(pPipe), &readfd)) 
     { 
      if(fgets(buf, sizeof(buf), pPipe) != NULL) 
      { 
       //cout << buf; 
       //strBuf << buf; 
      } 
      /** No Problem if there is no data ouput by script **/ 
      #if 1 
      else 
      { 
       //ret2 = -1; 
       // cout << "fgets() failed " << strerror(errno) << endl; 
       break; 
      } 
      #endif 
     } 
     else 
     { 
      ret2 = -1; 
    //   cout << "FD_ISSET() failed " << strerror(errno) << endl; 
      break; 
     } 
    } 

    /** Check the Script-timeout **/ 
    if((startTime + scriptTmOut) < time(NULL)) 
    { 
    // cout<<"Script Timeout"<<endl; 
     break ; 
    } 
} 
pclose(pPipe); 

return ret2; 

}

CPPはmnp_proxy_serverは、それが7001ポートに接続し、メッセージの送信を開始開始されると各種ポート7001および7045によって覆うリッスンサーバです。

問題が発生しました。私がctr^cシグナルをcppに送ると、シグナルはmnp_proxy_serverに伝播し、もし私がcppプロセスを殺すと、cppがリスニングしていたすべてのポートがmnp_proxy_serverプロセスの一部になります。 netstatコマンドの

出力CPPプロセスを殺した後

[ルート@ punithビン]#netstatの-alpn |グレップのmnp_pr

TCP 0 0 0.0.0.0:7045 0.0.0.0:*は 26186/mnp_proxy_ser

TCP 0 0 0.0.0.0:7001 0.0.0.0:*は26186/mnp_proxy_ser

を聞きます

私には、cppを通してmnp_proxy_serverの起動スクリプトを実行する方法と関係があることがわかります。

両方のバイナリにシグナルハンドラがあります。 ctr^cが押されたときにソケットの選択を終了するselectにパイプを使用したので、ctr^cを押したときにパイプの書き込み終了を閉じて選択が通知され、選択が出て実行ループを壊します。

どちらもC++で書かれていて、私はrhelを使っています これを解決するのに役立つ手がかりがあります。事前に感謝します。

答えて

1

それらは子プロセスで閉じられているように、あなたは、CPPのサーバソケット上のフラグCLOEXECを設定する必要があります。

fcntl(fd, F_SETFD, FD_CLOEXEC); 

をあなたのプロセスのようにソケットを使用している間、私は使用しフォークとexecの代わりを示唆していますforkとexecの間のすべてのソケットを閉じたり、管理したりすることができますが、フラグCLOEXECは問題を解決するのに十分かもしれません。

+1

また、setpgrp()を呼び出す必要があるかもしれません。 – vrdhn

+0

CLOEXECをパイプにも適用できますか? – punith

+0

はいできます。あなたはfileno(pPipe) –