【问题标题】:Limit execution time of a piped program限制管道程序的执行时间
【发布时间】:2012-05-13 11:23:17
【问题描述】:

我想在 C 程序中执行一个 Linux 命令并在程序中从这个命令中读取(解析)stdout。下面的代码有效,但除了字符串和字节读取限制之外,我不知道如何限制命令的执行时间。有什么想法吗?

FILE *ps_pipe; 
int bytes_read;
int nbytes = 100;
char *my_string=NULL;
char message[1024];
message=sprintf(message,"any command here");
ps_pipe = popen (message, "r");
my_string = (char *) malloc (nbytes + 1);
bytes_read = getdelim (&my_string, &nbytes, "delimiter_word", ps_pipe);
pclose(ps_pipe);
free(my_string);

【问题讨论】:

  • alarm 是你的朋友。
  • 要么关闭管道,要么关闭管道。子进程将以 EPIPE/SIGPIPE 终止。
  • @DavidSchwartz 我使用了警报,它可以工作,但我不知道为什么警报处理程序中的 pclose 无法使用文件描述符正确执行,文件描述符是全局变量,并且仅用于打开和 fread 的另一个函数。
  • 谢谢@DavidSchwartz

标签: c time pipe fork


【解决方案1】:

您可以使用 select() 来做到这一点。 Select 可以在一个或多个文件描述符上“等待”事件的发生(可读、可写……),并带有可选的超时。由于它对文件描述符进行操作,因此您还需要 fileno(ps_pipe)。

但请记住,您将无法轻易杀死分叉的进程,因为 popen 隐藏了子进程的某些细节。如果你需要这样的控制,你需要使用较低级别的函数 fork()、pipe()、dup()、exec()、wait() 和可能的 kill()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 2017-03-25
    • 2011-12-26
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多