C 非阻滞代理检查/打开
C++ non-blocking proxy check/open
我与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。
相关文章:
- 检查组合框是否已打开
- 检查CAPSLOCK在C++中是否打开/关闭
- C 非阻滞代理检查/打开
- 如何检查用户是否已打开应用程序
- 如何检查目录中是否打开了任何文件?
- 使用C++代码检查操作系统是否可用(如果可用,是否打开/关闭)
- 可视化如何检查Microsoft Outlook是否在C 中打开
- C++检查文件存在而不打开它
- RAWKEYBOARD 标志,检查哪些标志打开,还有 SHIFT、CTRL 和 ALT
- 数据文件处理中的错误检查是否可以打开文件 - 为什么会发生
- 如何在QWebView中打开web检查器
- 正在C++中检查打开的 UDP 端口
- Wxwidgets.如何检查wxauinotebook页面是否已打开/添加
- 如何检查文件未打开的原因
- 在不使用C++打开文件的情况下检查文件大小
- 如何检查服务器端口是否打开并从MFC连接
- 如何检查在exe中是否存在要打开的文件
- Qt如何检查openUrl()是否已经打开?在windows
- 如何检查SQLite数据库是否在C/ c++中打开
- 如何从客户端检查服务器端套接字是否打开