[英]Problems with system() calls in Linux
我正在為C ++ for Linux中的initramfs進行init
。 該腳本用於解鎖帶有LUKS加密驅動器的DM-Crypt,並將LVM驅動器設置為可用。
由於我不想重新實現cryptsetup
和gpg
的功能,因此我使用系統調用來調用可執行文件。 如果我已經完全啟動了系統,則使用系統調用來調用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.