C 非阻滞代理检查/打开

C++ non-blocking proxy check/open

本文关键字:检查 打开 代理      更新时间:2023-10-16

我与C++编写的程序有一个问题。我想在自由端口上打开一个袜子5代理,然后检查是否可以(用卷发检查(,然后释放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 badn");
            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 startn";
$array_exec = array();
// exec("./proxy",$array_exec);
system("./proxy");
var_dump($array_exec);
echo "Run endn";
?>

什么是解释,我该如何解决?

我正在考虑将php和nodejs与sqlite或类似的C 应用程序合并...

system()功能将等到过程完成并收集整个输出。

您应该将守护程序用于C ,也可以将其更改为:./proxy &,如果您不需要输出,则./proxy & > /dev/null

<?php
echo "Run startn";
$array_exec = array();
shell_exec("./proxy &",$array_exec);
var_dump($array_exec);
echo "Run endn";
?>

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}`);
});

update

而不是杀死,可以是deatach((而不是 ls.kill('SIGTERM');吗?喜欢在后台发送吗?我还将尝试您的变体,这也将帮助我

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

  • SIGINT表示中断。默认情况下,此信号导致该过程终止。在终端中,您可以按CTRL-C(在较旧的Unixes,del(发送SIGINT;
  • SIGTSTP表示终端停止。默认情况下,此信号导致该过程暂停执行。在终端中,您可以按CTRL-Z发送SIGTSTP;
  • SIGQUIT的意思是退出。此信号导致该过程终止和转储核心。在终端中,您可以按Ctrl- |用于发送sigtstp。