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

Dam*_*ian 10 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();
    }
    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或类似的东西......

gal*_*kin 2

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。