Linux C/C++源码实现常见命令mkdir
Linux系統是由文件和目錄組成的。當我們使用Linux系統時,經常會從中創建目錄來保存文件等等,這時會使用Linux自帶 mkdir 的命令,用于在操作系統中創建目錄或文件夾。在本文中,我們將討論如何使用帶有各種命令行選項的 mkdir 命令以及代碼實現。
mkdir命令代碼實現
在 Linux 中,雖然 rm 命令允許您刪除目錄,但首先是 mkdir 命令允許您創建目錄。下面我們實現mkdir命令:
#include <stdio.h> #include <sys/types.h> /*umask、stat*/ #include <sys/stat.h> /*chmod*/ #include <unistd.h> #include <err.h> #include <errno.h> #include <libgen.h> /*dirname*/ #include <stdlib.h> #include <string.h>/*int mkdir(const char *pathname, mode_t mode);mode方式:S_IRWXU 00700權限,代表該文件所有者擁有讀,寫和執行操作的權限S_IRUSR(S_IREAD) 00400權限,代表該文件所有者擁有可讀的權限S_IWUSR(S_IWRITE) 00200權限,代表該文件所有者擁有可寫的權限S_IXUSR(S_IEXEC) 00100權限,代表該文件所有者擁有執行的權限S_IRWXG 00070權限,代表該文件用戶組擁有讀,寫和執行操作的權限S_IRGRP 00040權限,代表該文件用戶組擁有可讀的權限S_IWGRP 00020權限,代表該文件用戶組擁有可寫的權限S_IXGRP 00010權限,代表該文件用戶組擁有執行的權限S_IRWXO 00007權限,代表其他用戶擁有讀,寫和執行操作的權限S_IROTH 00004權限,代表其他用戶擁有可讀的權限S_IWOTH 00002權限,代表其他用戶擁有可寫的權限S_IXOTH 00001權限,代表其他用戶擁有執行的權限*//*參數 mode 有下列數種組合:S_ISUID 04000 文件的 (set user-id on execution)位S_ISGID 02000 文件的 (set group-id on execution)位S_ISVTX 01000 文件的sticky 位S_IRUSR (S_IREAD) 00400 文件所有者具可讀取權限S_IWUSR (S_IWRITE)00200 文件所有者具可寫入權限S_IXUSR (S_IEXEC) 00100 文件所有者具可執行權限S_IRGRP 00040 用戶組具可讀取權限S_IWGRP 00020 用戶組具可寫入權限S_IXGRP 00010 用戶組具可執行權限S_IROTH 00004 其他用戶具可讀取權限S_IWOTH 00002 其他用戶具可寫入權限S_IXOTH 00001 其他用戶具可執行權限*/static int vflag;static void usage(void) {(void)fprintf(stderr,"usage: mkdir [-pv] [-m mode] directory_name ...\n"); }/**對于一個a/b/c這樣的一個多級目錄,要想實現父目錄的創建方法,可以進行字符串處理分出一級一級目錄.* 成功完成后,mkdir() 應返回 0。否則,應返回 -1,不應創建目錄,并應設置 errno 以指示錯誤。 */static int create_directory(char *path, mode_t omode) {struct stat sb;mode_t numask, oumask;int first, last, retval;char *p;/*檢查我們是否需要對中間目錄做任何事情*/p = path;oumask = 0;retval = 1;if (p[0] == '/') /* Skip '/'. */++p;for (first = 1, last = 0; !last ; ++p) {if (p[0] == '\0')last = 1;else if (p[0] != '/')continue;*p = '\0';if (!last && p[1] == '\0')last = 1;if (first) {oumask = umask(0);numask = oumask & ~(S_IWUSR | S_IXUSR);(void)umask(numask);first = 0;}if (last)(void)umask(oumask);if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {if (errno == EEXIST || errno == EISDIR) {/*判斷該文件或目錄是否否存在 ;得到st_mode,然后判斷是不是目錄文件。成功判斷返回的st_mode是否是一個文件夾。*/if (stat(path, &sb) < 0) {warn("%s", path);retval = 0;break;} else if (!S_ISDIR(sb.st_mode)) {if (last)errno = EEXIST;elseerrno = ENOTDIR;warn("%s", path);retval = 0;break;}if (last)retval = 2;} else {warn("%s", path);retval = 0;break;}} else if (vflag)printf("%s\n", path);if (!last)*p = '/';}if (!first && !last)(void)umask(oumask);return (retval); }int main(int argc, char *argv[]) {int ch, exitval, success, pflag;mode_t omode;void *set = NULL;char *mode;omode = pflag = 0;mode = NULL;while ((ch = getopt(argc, argv, "m:pv")) != -1)switch(ch) {case 'm':mode = optarg;break;case 'p':pflag = 1;break;case 'v':vflag = 1;break;case '?':default:usage();}argc -= optind;argv += optind;if (argv[0] == NULL)usage();if (mode == NULL) {omode = S_IRWXU | S_IRWXG | S_IRWXO;}for (exitval = 0; *argv != NULL; ++argv) {if (pflag) {success = create_directory(*argv, omode);} else if (mkdir(*argv, omode) < 0) {if (errno == ENOTDIR || errno == ENOENT)warn("%s", dirname(*argv));elsewarn("%s", *argv);success = 0;} else {success = 1;if (vflag)(void)printf("%s\n", *argv);}if (!success)exitval = 1;/*chmod()會依參數mode 權限來更改參數path 指定文件的權限。*/if (success == 1 && mode != NULL && chmod(*argv, omode) == -1) {warn("%s", *argv);exitval = 1;}}return (exitval); }編譯運行:
my_mkdir將創建一個名為 path 的新目錄。 新目錄的文件權限位應從模式初始化。 mode 參數的這些文件權限位應由進程的文件創建掩碼修改。
mkdir代碼時候很簡單, 主要用于在我們的 Linux 操作系統中創建目錄。居然代碼實現能創建目錄,我們接下來使用選項看看效果。
創建多目錄
當我們需要創建多目錄時,只需要命名我們要創建的目錄。這里需要注意一下,我們需要給目錄名稱加上空格以創建多個目錄。 可以使用以下命令:
./my_mkdir aaa bbb ccc
創建父目錄
./my_mkdir a/b
上面的命令將在目錄 a 中創建名為 b 的目錄。 如果目錄 a 不存在,則會顯示錯誤消息。
如果父目錄不存在,則使用 –p 選項將創建它。
如果目錄a不存在,mkdir命令將創建目錄a,并在目錄a內創建一個名為b的目錄。
如何在詳細模式下創建目錄?
我們可以使用 –v 選項以詳細模式創建新目錄。 當您使用此選項創建新目錄時,它將在屏幕中生成以下詳細輸出。
總結
以代碼實現mkdir命令,然后將 mkdir 與各種命令行選項結合使用。本篇可以看到 mkdir 是一個非常簡單的命令,可以很好的理解和使用。
歡迎關注微信公眾號【程序猿編碼】,歡迎添加本人微信號(17865354792)交流學習。
總結
以上是生活随笔為你收集整理的Linux C/C++源码实现常见命令mkdir的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql管理员权限哪个表_Mysql
- 下一篇: js||运算符