系统调用而不在R中调用shell

Ken*_*ams 35 r system

在基R,也有用于调用系统命令3个主要机制:system,system2,及shell(这似乎共享一个带手册页system).它们都没有提供一种非常可靠的跨平台方式来运行系统命令而没有shell阻塞 - 如果shell介入,我们需要担心shell注入攻击,关于确保引用是正确的,等等.

有些语言可以直接访问C级execvp函数(例如Perl的system PROGRAM LIST机制),当我想确保数组中的字符串正是子进程在其参数中看到的字符串时,这非常有用,而不需要查看适用于嵌入式空格,引号等的引用例程,并担心它们在不同平台和不同版本的shell上会做什么.

R中是否有类似的无shell系统调用机制,可能在某个CRAN包中?和/或是否有任何兴趣创建这样一个机制,如果还没有?

Jac*_*sey 1

以下代码在没有 shell 交互的情况下在 R 中运行命令:

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

我很确定这是一个坏主意,因为我认为它会在执行的进程完成后终止 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();
Run Code Online (Sandbox Code Playgroud)