Php C++;非阻塞代理检查/打开
我对用Php C++;非阻塞代理检查/打开,php,c++,node.js,Php,C++,Node.js,我对用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
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
}
}
}
然后它执行并在它之后执行命令,但是如果我从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
echo "Run start\n";
$array_exec = array();
// exec("./proxy",$array_exec);
system("./proxy");
var_dump($array_exec);
echo "Run end\n";
?>
PHP:
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
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 或类似的东西……< /P> < P> <强>节点.js< /St>>/P>
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
表示中断。默认情况下,此信号导致进程终止。在终端中,您可以按Ctrl-C(在旧的Unix中,DEL)发送SIGINT李>
SIGTSTP
表示终端停止。默认情况下,此信号导致进程暂停执行。在终端可以按Ctrl-Z键发送SIGTSTP李>
SIGQUIT
表示退出。此信号导致进程终止并转储内核。在终端中,您可以按Ctrl-|发送SIGTSTP
系统()
函数将等待过程完成并收集整个输出
您应该使用C++守护进程,或者只需将其更改为:<代码> /代理和<代码>,如果不需要输出,则<代码> /代理> /DEV/NULL> /COD> < /P>
<?php
echo "Run start\n";
$array_exec = array();
shell_exec("./proxy &",$array_exec);
var_dump($array_exec);
echo "Run end\n";
?>
。如果fork
成功,那么父进程获取一些值>0,子进程获取0.curlsockstest和open\u代理似乎不是google在某些库API中的一部分。你能分享他们的建议吗?我不是node.js或php方面的专家,但如果同时使用外部应用程序和挂起,则可能是C程序出了问题。可能是进程被终止并释放资源的方式。就像process1(父进程)停留,子进程死亡,然后PHP等待最后一个数据被发送,我想要一些东西来deattach()或其他东西,你知道如何从命令流中实时读取,如果var遇到deatch()的话从流程中?目前,打开代理的是您的父亲,而不是您的子流程。我不知道为什么作为一个独立的/proxy
“退出”。因此,它不会死,也不会像@Mason那样被用作一个辅助过程。执行方法的Mason更改是好的,但我认为您只是在覆盖PHP/NODE.JS代码的C++程序中修补了一个错误。你的第二个问题有点模糊。如果我理解正确的话,我认为一个基本的Linux消息队列可以完成这项工作。这是一个棘手的部分,我需要fork()
的输出,来判断代理是好是坏,但是看起来只要fork()
或parent
处于活动状态,PHP
就会等待…谢谢你的回答,它看起来不错,是事件式编程,但是如果我在过程中遇到了要deattach()
的问题,我可以在data
事件中做些什么吗?还是什么?我在错误流中的任何数据上添加了进程停止。它是你所需要的吗?它可以是deatach()
而不是'ls.kill('SIGTERM');`?喜欢在后台发送吗?我还将尝试您的变体,它将帮助我添加关于nginx信号的更新。我更改了SIGINT=>SIGTSTP
。这是我的工作。您能检查一下吗?这些将使用不同的信号终止进程,并且SIGTSTP
意味着停止进程,有没有办法将该pid附加到不同的tty
?