Проверка/блокировка прокси-сервера С++

У меня проблема с программой, написанной в C++. Я хочу открыть прокси SOCKS5 на свободном порту, а затем проверить, нормально ли это (проверка с помощью curl), а затем отпустить блокировку ввода-вывода. Это код:

С++

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
        }
    }
}

Если я делаю это из 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 start\n";
$array_exec = array();
// exec("./proxy",$array_exec);
system("./proxy");

var_dump($array_exec);
echo "Run end\n";

?>

Что такое объяснение и как я могу это решить?

Я собираюсь заставить PHP и NODEJS общаться с этим С++-приложением с помощью sqlite или что-то в этом роде...

Ответ 1

Функция system() будет ждать завершения процесса и сбора всего вывода.

Вы должны либо использовать демона для своего С++, либо просто изменить его на: ./proxy &, и если вам не нужен вывод, ./proxy & > /dev/null

<?php
echo "Run start\n";
$array_exec = array();

shell_exec("./proxy &",$array_exec);
var_dump($array_exec);
echo "Run end\n";
?>

Ответ 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}`);
});

Обновление

вместо kill может быть что-то вроде deatach() вместо ls.kill('SIGTERM');? как отправить его в фоновом режиме? я попробую также ваш вариант, это поможет мне и

Это не входит в штат Node.js. В списке сигналов Unix есть часть:

  • SIGINT означает прерывание. По умолчанию этот сигнал приводит к завершению процесса. В терминале вы можете нажать Ctrl-C (в старых Unix, DEL) для отправки SIGINT;
  • SIGTSTP означает остановку терминала. По умолчанию этот сигнал заставляет процесс приостанавливать выполнение. В терминале вы можете нажать Ctrl-Z для отправки SIGTSTP;
  • SIGQUIT означает "выйти". Этот сигнал заставляет процесс завершать и выгружать ядро. В терминале вы можете нажать Ctrl-| для отправки SIGTSTP.