如果我有一個腳本,無論出於何種原因,需要將當前工作目錄作爲存儲目錄,那麼我可以運行cd "$(dirname "${0}")"
。有一個簡單的方法來做到這一點與C程序?將工作目錄更改爲Linux上的C程序的位置
2
A
回答
1
2
2
$0
在shell腳本中對應於argv[0]
在C程序中。但是,如果該命令是基於PATH
找到的,則該方法將不起作用。
在Linux中,您可以檢查/proc/self/exe
僞符號鏈接以查看當前進程正在執行哪個二進制文件。您可以使用readlink("/proc/self/exe", buffer, size)
來獲取當前可執行文件的路徑。
例如,您可以使用例如
#define _POSIX_C_SOURCE 200809L
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
/* Return the path to the directory the current executable
resides in, as a dynamically allocated string.
If an error occurs, returns NULL with errno set.
*/
char *exe_dir(void)
{
size_t size = 512, i, n;
char *path, *temp;
while (1) {
ssize_t used;
path = malloc(size);
if (!path) {
errno = ENOMEM;
return NULL;
}
used = readlink("/proc/self/exe", path, size);
if (used == -1) {
const int saved_errno = errno;
free(path);
errno = saved_errno;
return NULL;
} else
if (used < 1) {
free(path);
errno = EIO;
return NULL;
}
if ((size_t)used >= size) {
free(path);
size = (size | 2047) + 2049;
continue;
}
size = (size_t)used;
break;
}
/* Find final slash. */
n = 0;
for (i = 0; i < size; i++)
if (path[i] == '/')
n = i;
/* Optimize allocated size,
ensuring there is room for
a final slash and a
string-terminating '\0', */
temp = path;
path = realloc(temp, n + 2);
if (!path) {
free(temp);
errno = ENOMEM;
return NULL;
}
/* and properly trim and terminate the path string. */
path[n+0] = '/';
path[n+1] = '\0';
return path;
}
請注意,您不一定需要使用chdir()
更改爲該路徑;您也可以使用例如open(path, O_PATH)
並使用該文件描述符作爲openat()
和其他* at()函數的參數。
如果可執行文件在文件系統層次結構中非常深,由於這個僞符號鏈接的性質,這可能會返回NULL與errno == ENAMETOOLONG
。替代方法,如閱讀/proc/self/maps
或/proc/self/smaps
的路徑,會遇到未固定的內核錯誤(我已經報道過),其中反斜槓\
的路徑得到錯誤的轉義。在任何情況下,如果exe_dir()
返回NULL,我熱烈地建議您的程序僅向用戶報告當前可執行文件所在的目錄無法確定(可能與原因一起,strerror(errno)
),然後中止。
相關問題
- 1. 如何將工作目錄更改爲程序的位置
- 2. 在C程序中更改Linux shell中的工作目錄
- 3. Linux程序更改java程序的工作目錄
- 4. 編譯時在Visual C++中更改程序的工作目錄
- 5. 將工作目錄更改爲當前腳本的目錄
- 6. 將主目錄中的RStudio默認目錄更改爲GNU/Linux中的其他位置
- 7. 在C中更改工作目錄?
- 8. 將目錄更改爲可執行文件的位置
- 9. 如何將dll位置更改爲Codelite中的子目錄?
- 10. 如何將當前工作目錄更改爲特定目錄並在特定目錄下執行程序?
- 11. Rails3:更改temp(tmp)目錄的位置
- 12. 如何更改.vnc目錄的位置
- 13. 更改特定靜態綁定程序集的工作目錄
- 14. 更改UFT工作目錄
- 15. Git更改工作目錄
- 16. 更改工作目錄
- 17. 更改工作目錄
- 18. MYOB ODBC驅動程序使用Compojure將工作目錄更改爲temp
- 19. 將工作目錄更改爲當前打開的文件
- 20. 在Linux上監視目錄的程序
- 21. 如何將曾經是目錄的文件更改回linux上的目錄?
- 22. 使用chdir()是在Linux C中更改工作目錄的唯一方法嗎?
- 23. 在Linux上爲C程序製作makefile
- 24. 將git目錄更改爲上一個
- 25. 如何將工作目錄設置爲C++中的「解決方案目錄」
- 26. 將程序的目錄設置爲JavaFX的初始目錄FileChooser
- 27. 更改Xcode中的工作目錄
- 28. 更改msbuild.exe的工作目錄
- 29. 更改ld-linux位置
- 30. SWI Prolog更改工作目錄/獲取當前工作目錄?
我知道'chdir()'改變了目錄。這不是問題。 – Melab