2012-05-13 68 views
0

我想在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); 
+0

[alarm](http://www.mkssoftware.com/docs/man3/alarm.3.asp)是你的朋友。 –

+0

要麼就是要關閉管道。子進程將以EPIPE/SIGPIPE結束。 – wildplasser

+0

@DavidSchwartz我使用警報,它的工作原理,但我不知道爲什麼報警處理程序中的pclose不能正確執行文件描述符,這是全局變量,並且在另一個函數中只與open和fread一起使用。 – risque

回答

0

你可以用select()來做到這一點。選擇可以「等待」一個或多個文件描述符以使事件發生(可讀,可寫,...),並有可選的超時。由於它對文件描述符進行操作,因此還需要fileno(ps_pipe)。

但請記住,您將無法輕鬆殺死分叉進程,因爲popen隱藏了子進程的某些細節。如果你需要這樣的控制,你需要使用低級函數fork(),pipe(),dup(),exec(),wait()和可能的kill()。