我写了一个程序的问题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
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我从cmd这样做
./proxy; ls -al;
Run Code Online (Sandbox Code Playgroud)
然后它正在执行并在它之后执行命令,但如果我从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);
Run Code Online (Sandbox Code Playgroud)
PHP:
<?php
echo "Run start\n";
$array_exec = array();
// exec("./proxy",$array_exec);
system("./proxy");
var_dump($array_exec);
echo "Run end\n";
?>
Run Code Online (Sandbox Code Playgroud)
什么是探索,我该如何解决这个问题?
我正在考虑让PHP和NODEJS与这个C++应用程序通信sqlite或类似的东西......
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}`);
});
Run Code Online (Sandbox Code Playgroud)
更新
可以用 deatach() 代替 Kill 吗
ls.kill('SIGTERM');?喜欢在后台发送吗?我也会尝试你的变体,它也会对我有帮助
这不是 Node.js 人员的一部分。Unix 信号列表有一部分:
SIGINT意思是中断。默认情况下,此信号会导致进程终止。在终端中,您可以按 Ctrl-C(在较旧的 Unix 中为 DEL)来发送 SIGINT;SIGTSTP表示终点站。默认情况下,该信号会导致进程暂停执行。在终端中您可以按 Ctrl-Z 发送 SIGTSTP;SIGQUIT意味着退出。该信号导致进程终止并转储核心。在终端中您可以按 Ctrl-| 用于发送 SIGTSTP。| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |