私は奇妙な問題があります。私は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を使っています これを解決するのに役立つ手がかりがあります。事前に感謝します。
また、setpgrp()を呼び出す必要があるかもしれません。 – vrdhn
CLOEXECをパイプにも適用できますか? – punith
はいできます。あなたはfileno(pPipe) –