C ++在shell中使用timer执行多个命令

时间:2017-05-17 15:10:40

标签: c++ linux bash shell

在同一个shell中执行多个shell命令并在一个和另一个之间延迟的最佳方法是什么?

,例如,这是一个示例代码,它在不同的shell中执行cdls命令。如何添加10秒延迟并在同一个shell中运行它们?也许与usleep

#include <iostream>
#include <stdlib.h>
#include <ctime>
#include <cerrno>
#include <unistd.h>
#include <chrono>
#include <thread>

int main() {
   system("gnome-terminal -x sh -c 'cd; ls; exec bash'");
   return 0;
}

1 个答案:

答案 0 :(得分:1)

您可以使用std::this_thread::sleep_for

您应该使用fork + exec*(+ wait)代替systemsystem容易受到别名攻击而且您无法正常处理错误用它。

修改

示例:

#include <unistd.h>
#include <thread>
#include <chrono>

//Function made in less than 5 minute
// You should improve it (error handling, ...)
// I use variadic template to be able to give a non fixed
// number of parameters
template<typename... str>
void my_system(str... p) {
    // Fork create a new process
    switch fork() {
        case 0: // we are in the new process
            execl(p..., (char*)nullptr); // execl execute the executable passed in parameter
            break;
        case -1: // Fork returned an error
            exit(1);
        default: // We are in the parent process
            wait(); // We wait for the child process to end
            break;
    }
}

int main() {
    using namespace std::chrono_literals;
    // start a command
    my_system(<executable path>, "cd") ;
    // sleep for 2 second
    std::this_thread::sleep_for(2s);
    // ....
    my_system(<executable path>, "ls") ;
    std::this_thread::sleep_for(2s);
    my_system(<executable path>, "exec", "bash") ;
    std::this_thread::sleep_for(2s);
}

警告此代码未经过测试,请勿进行任何错误处理,并且可能存在错误!我会让你解决它。检查手册页以获取对posix库(execlforkwait)的调用以及sleep_forchrono的上述链接。