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