2014-11-05 24 views
35

在R中,調用系統命令有3種主要機制:system,system2shell(它似乎與system共享一個聯機幫助頁)。沒有一個提供了非常可靠的跨平臺方式來運行系統命令,而不會發生shell阻塞 - 如果shell進行干預,我們需要擔心shell注入攻擊,確保引用是正確的,等等。系統調用時無需調用R中的shell

某些語言提供對C級execvp函數(例如Perl的system PROGRAM LIST機制)的直接訪問,當我想確保數組中的字符串恰好是子進程將在其參數中看到的字符串時,這非常有用,而不是四處尋找嵌入的空白,引號等適當的引用例程,並擔心他們將在不同的平臺和不同版本的shell上執行什麼操作。

在R中是否有類似的無殼系統調用機制,可能在某個CRAN包中?和/或是否有任何建立這樣的機制的胃口,如果沒有一個呢?

+0

非常有趣的問題,我想知道答案。然而,就目前而言,這個問題可能被解釋爲要求一種工具(非主題)或主要是基於意見的工具。我不會投票結束,但也許您可以應用一些編輯來避免這些結果? – Andrie 2014-11-05 21:44:54

+0

@Andrie在最後一段不是第一個問題嗎? – 2014-11-05 21:53:02

+0

@PauloCardoso,Andrie指出,最後一段*中的第一個問題是*「請求工具」。我想用一段簡單的代碼將一個字符串傳遞給'execvp'會很容易... – 2014-11-05 22:55:41

回答

1

下面的代碼運行中的R命令無殼互動:

library(inline) 
cfun <- cfunction(sig = signature(), 
      includes = "#include <unistd.h>", 
body = 'execl("/bin/date", "date", 0, 0, (char *)0);') 
cfun() 

我敢肯定,這是一個壞主意,因爲我認爲它會在執行過程完成時終止R過程。叉子怎麼樣?

基本封裝並行C函數mc_fork使用C系統命令fork來實現此目的,使用管道進行進程間通信。我不知道MinGW會如何在Windows上運行,但由於它位於基本軟件包中,它看起來很可能會起作用,儘管可能採用了非常不同的下游機制。

在R源parallel我看到R-devel/src/library/parallel/src/fork.c

SEXP mc_fork(SEXP sEstranged) 
... 
pid = fork(); 
0

擴展在@Jack Wasey的直覺:

library(inline) 
cfun <- cfunction(sig = signature(), 
      includes = "#include <unistd.h>", 
body = ' 
pid_t fk = fork(); 
if (!fk) { 
    execl("/bin/date", "date", 0, 0, (char *)0); 
} else if (fk == -1) { 
    perror("fork"); 
} 
return(R_NilValue); 
') 
cfun() 

...使用fork,以防止當前進程的劫持(在至少在Linux中),但安全地返回給R,沒有什麼可以顯示的。