gpt4 book ai didi

c++ - 使用两个线程和 system() 命令运行 shell 脚本 : how to make sure that one shell script is started before another

转载 作者:行者123 更新时间:2023-12-01 14:43:48 27 4
gpt4 key购买 nike

有两个shell脚本:

#shell_script_1
nc -l -p 2234
#shell_script_2
echo "hello" | nc -p 1234 localhost 2234 -w0

从 C++ 程序内部,我想先运行 1 号 shell 脚本,然后运行 ​​2 号 shell 脚本。我现在拥有的是这样的:
#include <string>
#include <thread>
#include <cstdlib>
#include <unistd.h>

int main()
{
std::string sh_1 = "./shell_script_1";
std::string sh_2 = "./shell_script_2";

std::thread t1( &system, sh_1.c_str() );

usleep( 5000000 ); //wait for 5 seconds

std::thread t2( &system, sh_2.c_str() );

t1.join();
t2.join();

}

当我运行上面的程序时,shell_script_1 在 shell_script_2 之前运行,正如预期的那样。但是,等待 5 秒是否足以确保两个 shell 脚本按顺序启动?除了设置计时器并交叉手指之外,我还能执行命令吗?谢谢。

最佳答案

在第二个脚本之前“启动”第一个脚本是不够的。您希望第一个脚本实际监听您指定的端口。为此,您需要定期检查。这将取决于平台,但在 Linux 上您可以检查 /proc/PID第一个 child 知道它打开了哪些文件描述符,和/或运行nc -z检查端口是否正在监听。

一种更简单的方法是,如果第二个脚本连接失败并且第一个线程仍在运行,则自动重试第二个脚本几次。

一种更复杂的方法是让你的 C++ 程序绑定(bind)两个端口并监听两个端口,然后将你的第一个脚本更改为连接而不是监听。这样,两个脚本都将充当客户端,而您的 C++ 启动器将充当服务器(即使它所做的只是在两个 child 之间传递数据),从而为您提供更多控制权并避免竞争。

关于c++ - 使用两个线程和 system() 命令运行 shell 脚本 : how to make sure that one shell script is started before another,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59434602/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com