是否有可能在C中使用系统API启动命令?如果没有其他选择?

时间:2015-05-14 08:54:57

标签: c++ c

我正在使用系统api启动一个命令(我可以使用这个api与 C / C ++ )。我传递的命令有时可能会挂起,因此我想在超时后杀死它。

目前我正在使用它:

system("COMMAND");

我想用这样的东西:

使用独立于系统的API运行命令(我不想使用CreateProcess,因为它仅适用于Windows)如果在“X”分钟后没有退出,请终止进程。

4 个答案:

答案 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来阻止它。