我陷入了一個奇怪的問題。Linux:在運行時設置語言環境和進程間依賴關係
我有兩個腳本(C程序的可執行文件)ARM的Linux機器被安裝在兩個不同的路徑相同的USB設備(含有中國字符的文件名),只要該裝置插入上運行。
int mount(const char *source, const char *target,
const char *filesystemtype, unsigned long mountflags,
const void *data);
在最後一個參數, 腳本A通過「UTF8」和腳本B通過0
所以,當我插入USB設備,腳本比賽來安裝設備。
如果腳本A安裝第一(其中通過UTF8參數),我得到正確的文件名。這是mount
命令的輸出[注意,即使第二個mount沒有通過,第二個mount也有utf8作爲參數。爲什麼?]
/dev/sdb1 on /home/root/script1 type vfat (ro,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-r
o)
/dev/sdb1 on /home/root/script2 type vfat (ro,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed
,utf8,errors=remount-ro)
但如果腳本B座第(其中通過0作爲最後一個參數來安裝),我得到碎文件名?????.mp3
從readdir()
。這是mount
命令的輸出。
/dev/sdb1 on /home/root/script2 type vfat (ro,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
/dev/sdb1 on /home/root/script1 type vfat (ro,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed
,errors=remount-ro)
編輯
這無論是對開發測試腳本的基本安裝代碼(僅在最後一個掛載參數差異)。這兩個腳本在使用服務重新啓動時立即執行。
//mount the device
ret = mount("/dev/sda1", "/home/root/script1/", "vfat", 1, "utf8");
if (ret == 0) {
fprintf(stdout,"mount() succeeded.\n");
sleep(2000);
} else {
ret = mount("/dev/sdb1", "/home/root/script1/", "vfat", 1, "utf8");
if(ret == 0)
{
fprintf(stdout,"mount() succeeded\n");
sleep(2000);
}
else
{
fprintf(stdout,"/dev/sdb1 mount() failed: %d, %s\n", errno, strerror(errno));
ret = mount("/dev/sdc1", "/home/root/script1/", "vfat", 1, "utf8");
if(ret == 0)
{
fprintf(stdout,"mount() succeeded\n");
sleep(2000);
}
else
fprintf(stdout,"mount() failed: %d, %s\n", errno, strerror(errno));
}
}
Pure C,如果它很重要。編輯了這個問題。 –
所以問題在於腳本A和腳本B之間的競爭條件。它如何與c語言環境和C相關? – myaut
只要我們沒有看到mount命令,我們就不能告訴你爲什麼腳本2失敗。請發佈script2的代碼 – Nidhoegger