2014-04-29 42 views
0

我在linux中使用系統api來實現shell命令操作。有時在執行該命令時,系統調用會被阻止並永遠不會返回。因此,如果我知道執行的命令的進程ID,我將終止該進程並再次調用系統API。獲得由系統api執行的pid命令調用

如:

system("ftpget -u<> -p<> ip remote-file local-file"); 

有時ftpget塊和系統調用永遠不會返回。所以我不希望系統調用被無限期阻止。除殺死ftpget進程之外是否還有其他解決方案? 如果不是,那麼我如何獲得ftpget的進程ID?

+1

'system'是'fork' /'exec'方便的函數。如果你想要pid,你必須犧牲便利性。 –

+0

正如上面的評論,但'posix_spawn'可能證明這些日子更好的選擇。 – davmac

回答

0

如果您沒有併發ftpget實例運行,那麼您可能會放棄使用killall的system()來獲取pid,並通過名稱來終止進程。

system("killall ftpget"); 

您應該考慮使用類似execv()但是如果你真的需要殺死一個孤立的例子。

0

不幸的是system()沒有提供任何機制來告訴調用者子進程的PID。您可以使用fork()/exec()直接啓動子進程並保留自己使用的pid。

請注意,如此啓動的進程可能會自行產生子進程,這將再次產生您不知道的pid。

實施例(未測試):

#include <stdlib.h> 
#include <unistd.h> 
#include <sys/wait.h> 

int main() { 
    pid_t pid = fork(); 
    if (pid == 0) { 
     // child 
     execlp("ftpget", "ftpget", "-u<>", "-p<>", "ip", 
       "remote-file", "local-file", (char*)NULL); 
     exit(-1); // this will only ever happen when exec fails 
    } 
    else if (pid > 0) { 
     // parent 
     std::cout << "pid of child process is " << pid << "\n"; 
     waitpid(pid, 0, 0); 
    } 
    else { 
     // error 
    } 
} 

參考: