2014-11-05 15 views
35

Trong cơ sở R, có 3 cơ chế chính để gọi lệnh hệ thống: system, system2shell (có vẻ như chia sẻ manpage với system). Không ai trong số họ cung cấp một cách nền tảng rất đáng tin cậy để chạy một lệnh hệ thống mà không có một trình cản cản - và nếu một trình bao can thiệp, chúng ta cần phải lo lắng về các cuộc tấn công bằng shell, về việc đảm bảo trích dẫn là chính xác, v.v. .Gọi hệ thống mà không gọi vỏ trong R

Một số ngôn ngữ cung cấp quyền truy cập trực tiếp vào chức năng execvp cấp C (ví dụ: cơ chế system PROGRAM LIST của Perl), cực kỳ hữu ích khi tôi muốn đảm bảo rằng các chuỗi trong một mảng là chính xác các chuỗi mà quy trình con sẽ thấy trong các đối số của nó , mà không cần nhìn xung quanh để biết thói quen trích dẫn thích hợp cho khoảng trắng được nhúng, dấu ngoặc kép, v.v ... và lo lắng về những gì họ sẽ làm trên các nền tảng khác nhau và các phiên bản khác nhau của các trình bao.

Có cơ chế gọi hệ thống no-shell tương tự có sẵn trong R, có lẽ trong gói CRAN ở đâu đó không? Và/hoặc là có bất kỳ sự thèm ăn để tạo ra một cơ chế như vậy nếu không có một?

+0

Câu hỏi rất thú vị và tôi muốn biết câu trả lời. Tuy nhiên, như nó đứng, câu hỏi có thể có thể được giải thích là một trong hai yêu cầu cho một công cụ (tắt chủ đề) hoặc chủ yếu dựa trên ý kiến. Tôi sẽ không bỏ phiếu để đóng, nhưng có lẽ bạn có thể áp dụng một chút chỉnh sửa để tránh những kết quả này? – Andrie

+0

@Andrie không phải là câu hỏi đầu tiên trong đoạn cuối đủ? –

+0

@PauloCardoso, như Andrie chỉ ra, câu hỏi đầu tiên trong đoạn cuối * là * "yêu cầu một công cụ". Tôi tưởng tượng nó sẽ dễ dàng để viết một gói với một đoạn nhỏ của mã mà chỉ cần thông qua một chuỗi để 'execvp' ... –

Trả lời

1

Các mã sau chạy một lệnh trong R mà không cần sự tương tác shell:

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

Tôi khá chắc chắn đây là một ý tưởng tồi, như tôi nghĩ rằng nó sẽ chấm dứt quá trình R sau khi hoàn thành quá trình thực thi. Gì về ngã ba?

Gói cơ sở song song chức năng C mc_fork sử dụng lệnh hệ thống C fork để đạt được điều này, với đường ống cho truyền thông liên tiến trình. Tôi không biết làm thế nào điều này sẽ bay trên Windows với MinGW, nhưng vì nó là trong một gói cơ sở, nó có vẻ có khả năng làm việc, mặc dù có lẽ với một cơ chế hạ lưu rất khác nhau.

Trong nguồn R cho parallel tôi thấy trong R-devel/src/library/parallel/src/fork.c

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

Mở rộng trên trực giác @Jack Wasey của:

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() 

... sử dụng nĩa để ngăn chặn việc chiếm quyền điều khiển của quá trình hiện hành (tại ít nhất trong Linux), nhưng trả lại cho bạn một cách an toàn để R không có gì để hiển thị cho nó.

Các vấn đề liên quan