簡體   English   中英

Linux中的system()調用問題

[英]Problems with system() calls in Linux

我正在為C ++ for Linux中的initramfs進行init 該腳本用於解鎖帶有LUKS加密驅動器的DM-Crypt,並將LVM驅動器設置為可用。

由於我不想重新實現cryptsetupgpg的功能,因此我使用系統調用來調用可執行文件。 如果我已經完全啟動了系統,則使用系統調用來調用gpg可以正常工作(我已經有一個基於bash腳本的initramfs,可以很好地啟動它,並且我使用grub編輯命令行以使用以下命令啟動它舊的initramfs)。 但是,在initramfs中,它甚至不會像調用它那樣起作用。 甚至像system("echo BLAH");這樣的命令system("echo BLAH"); 失敗。

那么,有人有任何輸入嗎?


編輯:所以我想出是什么導致我的錯誤。 我不知道為什么會導致錯誤,但是我找到了。

為了允許熱插拔,我需要將/sbin/mdev寫入/sbin/mdev /proc/sys/kernel/hotplug ...但是最終我在參數之間進行了切換(在我自己寫的函數上),所以我正在編寫/proc/sys/kernel/hotplug/sbin/mdev

我不知道為什么會導致問題,但是確實如此。

我相信system()函數在shell中執行您的命令。 在啟動過程的早期階段,shell可執行文件是否已安裝並可用? 您可能想研究使用fork()和execve()。

編輯:請確保您的加密工具也在已裝載的卷上。

Amardeep是正確的,POSIX類型的系統上的system()通過/bin/sh運行命令。

我懷疑您實際上是否有必要通過Bourne shell調用這些程序。 一個很好的理由是,如果您需要它們具有默認的環境變量集,但是由於/etc/profile可能在啟動過程的早期就不可用,因此在這里我看不到這種情況。

而是使用標准的fork()/exec()模式:

int system_alternative(const char* pgm, char *const argv[])
{
    pid_t pid = fork();
    if (pid > 0) {
        // We're the parent, so wait for child to finish
        int status;
        waitpid(pid, &status, 0);
        return status;
    }
    else if (pid == 0) {
        // We're the child, so run the specified program.  Our exit status will
        // be that of the child program unless the execv() syscall fails.
        return execv(pgm, argv);
    }
    else {
        // Something horrible happened, like system out of memory
        return -1;
    }
}

如果您需要從被調用的進程讀取stdout或將數據發送到其stdin,則需要通過其中的pipe()dup2()進行一些標准的句柄重定向。

您可以在任何一本優秀的Unix編程書中學習有關這種事情的所有信息。 我推薦W. Richard Stevens 在UNIX環境中使用Advanced Programming Rago與他人合着的第二版增加了涵蓋史蒂文斯(Stevens)撰寫第一版以來出現的平台的資料,例如Linux和OS X,但是自最初版以來,此類基礎沒有改變。

您在initramfs中有什么? 您可以執行以下操作:

int main() {
   return system("echo hello world");

}

然后在這樣的初始化腳本中跟蹤它:

strace -o myprog.log myprog

啟動系統后查看日志

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM