C ++非阻塞代理检查/打开

我用C++编写的程序有问题。 我想打开一个空闲端口上的SOCKS5代理,然后检查是否可以(检查curl),然后释放I / O阻塞。 这是代码:

C ++

 main() { char* s_sockshost = "127.0.0.1"; socks_port = find_empty_port(); if(fork()) { // child process continues and opens a socks open_proxy(); } else { // parrent process just checks something then dies for(int i = 0; i < 20; i++) { proxytest = curlsockstest(s_sockshost,socks_port); if(proxytest) { break; } sleep(1); } if(proxytest) { if(hitdebug >= 3) printf("check_result : is opened on %s",socks_port); exit(0); // kill just this process } else { if(hitdebug >= 3) printf("check_result : is bad\n"); kill(getppid(), SIGKILL); // kill both processes } } } 

如果我从cmd这样做

 ./proxy; ls -al; 

那么它正在执行并执行它后面的命令,但是如果我从PHP或NODEJS执行它挂,就像期待完成。

的NodeJS:

 var exec = require('child_process').exec; var cmd = './proxy; ls -al;'; setTimeout(function(){ console.log("Timer"); exec(cmd, function(error, stdout, stderr) { console.log("error: "); console.log(error); console.log(); console.log("stdout: "); console.log(stdout); console.log(); console.log("stderr: "); console.log(stderr); console.log(); }); console.log("Timer end"); },2000); 

PHP:

 <?php echo "Run start\n"; $array_exec = array(); // exec("./proxy",$array_exec); system("./proxy"); var_dump($array_exec); echo "Run end\n"; ?> 

什么是探索,我该如何解决这个问题?

我想使PHP和NODEJS与这个C ++应用程序与sqlite或类似的东西… …通讯

system()函数将等待进程完成并收集整个输出。

您应该为您的C ++使用守护进程,或者您可以简单地将其更改为: ./proxy & ,如果不需要输出, ./proxy & > /dev/null

 <?php echo "Run start\n"; $array_exec = array(); shell_exec("./proxy &",$array_exec); var_dump($array_exec); echo "Run end\n"; ?> 

Node.js的

 const { spawn } = require('child_process'); const ls = spawn('proxy');//@see https://nodejs.org/api/child_process.html#child_process_class_childprocess ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); ls.stderr.on('data', (data) => { console.log(`stderr: ${data}. We should stop the child_process`); ls.kill('SIGTSTP'); }); ls.on('close', (code) => { console.log(`child process exited with code ${code}`); }); 

更新

而不是杀死它可以是deatach()而不是ls.kill('SIGTERM'); ? 像发送背景? 我也会尝试你的变体,它也会帮助我

这不是Node.js工作人员的一部分。 有一部分Unix信号列表:

  • SIGINT意味着中断。 默认情况下,该信号导致进程终止。 在terminal中,您可以按Ctrl-C(在旧的Unix,DEL)发送SIGINT;
  • SIGTSTP表示terminal停止。 默认情况下,该信号会导致进程挂起执行。 在terminal中可以按Ctrl-Z发送SIGTSTP;
  • SIGQUIT意味着退出。 该信号导致进程终止并转储核心。 在terminal中,您可以按Ctrl- | 用于发送SIGTSTP。