我正在使用系统api启动一个命令(我可以使用这个api与 C / C ++ )。我传递的命令有时可能会挂起,因此我想在超时后杀死它。
目前我正在使用它:
system("COMMAND");
我想用这样的东西:
使用独立于系统的API运行命令(我不想使用CreateProcess,因为它仅适用于Windows)如果在“X”分钟后没有退出,请终止进程。
答案 0 :(得分:2)
由于0
是特定于平台的调用,因此无法采用独立于平台的方式来解决您的问题。但是,NULL
是一个POSIX调用,因此如果在任何给定的平台上都支持它,那么POSIX API的其余部分也应如此。因此,解决问题的一种方法是使用system()
和system()
。
有一个复杂的问题是fork()
调用一个shell,它可能会产生其他进程,我认为你想要杀掉所有进程,所以一种方法是使用进程组。基本思路是使用kill()
创建另一个进程,将其放在自己的进程组中,如果在一定时间后没有退出,则终止该组。
一个简单的例子 - 程序分叉;子进程将其自己的进程组设置为与其进程ID相同,并使用system()
生成无限循环。父进程等待10秒,然后使用子进程PID的负值终止进程组。这将终止分叉进程和该进程的任何子进程(除非他们已经更改了进程组。)
由于父进程位于不同的组中,fork()
对其没有影响。
system()
答案 1 :(得分:0)
没有标准的跨平台系统API。提示是它们是系统API!我们实际上很幸运#34;我们得到area.AxisX.IsMarginVisible = false;
,但除此之外我们没有得到任何其他内容。
你可以尝试找一些第三方抽象。
答案 2 :(得分:0)
检查以下基于C ++线程的linux尝试。 (未经测试)
#include <iostream>
#include <string>
#include <thread>
#include <stdio.h>
using namespace std;
// execute system command and get output
// http://stackoverflow.com/questions/478898/how-to-execute-a-command-and-get-output-of-command-within-c
std::string exec(const char* cmd) {
FILE* pipe = popen(cmd, "r");
if (!pipe) return "ERROR";
char buffer[128];
std::string result = "";
while(!feof(pipe)) {
if(fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
pclose(pipe);
return result;
}
void system_task(string& cmd){
exec(cmd.c_str());
}
int main(){
// system commad that takes time
string command = "find /";
// run the command in a separate thread
std::thread t1(system_task, std::ref(command));
// gives some time for the system task
std::this_thread::sleep_for(chrono::milliseconds(200));
// get the process id of the system task
string query_command = "pgrep -u $LOGNAME " + command;
string process_id = exec(query_command.c_str());
// kill system task
cout << "killing process " << process_id << "..." << endl;
string kill_command = "kill " + process_id;
exec(kill_command.c_str());
if (t1.joinable())
t1.join();
cout << "continue work on main thread" << endl;
return 0;
}
答案 3 :(得分:-1)
我不知道用C或C ++语言做任何可移植的方法。当你要求替代方案时,我知道它可以用其他语言。例如,在Python中,可以使用subprocess
模块。
import subprocess
cmd = subprocess.Popen("COMMAND", shell = True)
然后,您可以测试COMMAND是否以
结束if cmd.poll() is not None:
# cmd has finished
你可以用:
杀死它cmd.terminate()
即使你喜欢使用C语言,也应该阅读documentation for subprocess module,因为它解释了内部它在Windows上使用CreateProcess
而在Posix系统上使用os.execvp
来启动命令,它在Windows上使用TerminateProcess
,在Posix上使用SIG_TERM
来阻止它。