調用system()
是容易的,但效率非常低,主要是因爲你不只是啓動任何程序你指定。相反,您正在啓動一個進程(一個shell),並且該shell將檢查您的參數並啓動第二個進程。
如果您所使用的系統支持fork()
和exec*()
,那麼您將改爲使用它們來提高性能。作爲一個僞代碼示例,請考慮:
void replace_system(const char *command)
{
pid_t child = fork();
if (child < 0) {
perror("fork:");
return;
}
if (child) {
/* this is the parent, wait for the child to finish */
while (waitpid(child, &status, options) <= 0);
return;
}
/* this is the new process */
exec*(...);
perror("failed to start the child");
exit(-1);
}
根據您希望如何排列參數選擇一個exec *函數。你需要將你的參數串分解成組件,並可能提供你喜歡的環境。一旦調用exec *函數,該函數將永遠不會返回(除非啓動您爲其定義的命令時出現錯誤)。
除了性能方面的考慮,使用它的另一個原因是,如果需要,它允許您修改孩子的標準路徑。例如,你可能對一個孩子的輸出感興趣;如果您將其stdout修改爲可供您使用的管道,則可以簡單地閱讀它打印的內容。調用標準popen()
調用源代碼來查找此示例。
來源
2014-02-20 12:01:40
mah
是否可以選擇擁有* persistent * Java實例,並通過JNI調用/回調進行通信? (這當然可以這樣做,問題是如果它可以被你接受,或者你每次需要*一個完全不同的Java實例)。 – DevSolar
謝謝,我會試一試。我只是沒有太多的Java經驗。 – Dmitry