一:背景

linux 中的mkdir命令是用来创建一个目录的,相应的就需要使用到linux中的系统调用函数mkdir来实现目录创建的功能。单单只是创建目录的话一个系统调用足以,本文是使用mkdir函数来实现mkdir -p这个选项的功能,对其不存在的父目录实现创建。

二:思路

对于一个a/b/c这样的一个多级目录,要想实现父目录的创建方法和思路有很多,可以进行字符串处理分出一级一级目录来,但是这样实现很是繁琐,以至于我想到了递归实现。

思路如下:

1.先判断a/b/c是否存在,不存在获取其父目录判断。若存在直接退出

2.判断a/b是否存在,不存在就获取其父目录,若存在退出

3.判断a/是否存在,不存在就获取其父目录,若存在退出

4.如果其父目录为.或/时退出

思路大体如下。为了实现以上过程,需要一个可以获得一个目录的父目录的函数。果断man。

最终定位到dirname函数非常符合我的要求。函数声明如下:

#include <libgen.h>
char *dirname(char *path);

三:实现

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <libgen.h>
#include <string.h>#define MAXSIZE 100
void Createdir(char *);
int main(int argc,char *argv[])
{
#判断参数if(argc <= 1){printf("mkdir:Usage:dirstr\n");exit(1);}
#遍历参数,对每个参数进行操作while(--argc){argv++;Createdir(*argv);}
}void Createdir(char *path)
{char data[MAXSIZE];#判断是否是当前目录或/目录if((strcmp(path,".") == 0) || (strcmp(path,"/")==0))return;#判断目录是否存在if(access(path,F_OK) == 0)return;else{#保存目录strcpy(data,path);#获取目录的父目录dirname(path);#递归执行Createdir(path);}#创建目录if(mkdir(data,777) == -1){perror("mkdir error");exit(1);}return;
}

四:总结

在写mkdir -p这个功能的时候,思路很明确,代码也基本上早就写好了,但是调试花了很长时间。究其原因是在于dirname这个函数,看其声明很明显就是给一个目录的path字符串指针,返回一个指向其目录的字符串指针,但是其实不然。dirname不仅返回一个指向其父目录的字符串指针还可能修改传入的参数path的值为父目录字符串。man文档中说明如下:

The  dirname()  function  may  modify  the string pointed to by path, and may return apointer to static storage that may then be overwritten by subsequent calls to dirname().
最终还是通过printf打印调试的,没有借助gdb,主要还是这家伙用起来不舒服。

转载于:https://blog.51cto.com/forlinux/1530287

linux C实现mkdir功能相关推荐

  1. linux下C语言mkdir,Linux C实现mkdir功能

    一:背景 Linux 中的mkdir命令是用来创建一个目录的,相应的就需要使用到linux中的系统调用函数mkdir来实现目录创建的功能.单单只是创建目录的话一个系统调用足以,本文是使用mkdir函数 ...

  2. 自学linux指令分析-mkdir

    自学linux指令分析-mkdir 1·命令格式 mkdir [option] [directory-list] mkdir [参数][目录名] 2·命令参数 使用帮助命令:man mkdir或mkd ...

  3. Hi3518EV300芯片linux系统配置USB Camera功能

    Hi3518EV300芯片linux系统配置USB Camera功能 一,安装好虚拟机VMware® Workstation 15 Pro 和Ubuntu16.04 64位版本:并且安装应用软件,配置 ...

  4. linux mkdir命令用法,linux中的mkdir命令的详细解释

    linxu下的mkdir命令从字面上就可以理解其实是创建文件或者目录的意思.下面由学习啦小编为大家整理了linux的mkdir命令的详细解释的相关知识,希望对大家有帮助! 一.linux中的mkdir ...

  5. 开启Linux系统路由转发功能 实现多网段电脑共享上网

    开启Linux系统路由转发功能 实现多网段电脑共享上网 作者:佚名 字体:[增加 减小] 来源:互联网 时间:07-13 13:03:29 我要评论 目前,Linux的主要应用在服务器领域,但是它的许 ...

  6. linux下加入回收站功能

    linux下没有回收站的功能,今天试着在linux下加入回收站功能,用shell来实现,嘿嘿,很不错哦.  shell真是太强大了~~ 代码如下: alias rm=trash alias rl='l ...

  7. windows借鉴linux了吗,Windows应该借鉴Linux的10大功能特征

    Windows应该借鉴Linux的10大功能特征 2009年12月07日 11:11作者:cnbeta编辑:陈涛文章出处:泡泡网原创 分享 泡泡网软件频道12月7日 在可预见的未来,Windows和L ...

  8. python实现linux命令输出两列_Python实现Linux命令xxd -i功能

    def Xxdi(): #解析命令行选项及参数 ([base, cols, strip], [inFile, outFile]) = ParseOption() import os if os.pat ...

  9. 关于Windows应用商店中安装Ubuntu问题——请启动适用于Linux的Windows子系统功能

    在Windows商店中下载Ubuntu的时候很多人会遇到安装失败的问题. 如果报错信息显示"请启动适用于Linux的Windows子系统功能",那么可以在Windows搜索框中搜索 ...

最新文章

  1. FTP主动模式与被动模式的解决与原理
  2. nginx php 配置请求等待时间_CVE-2019-11043: PHP-FPM在Nginx特定配置下任意代码执行漏洞预警...
  3. 理论基础 —— 二叉树 —— 三叉链表
  4. 实用的Safari浏览器扩展工具——浏览标签太多?来一键保存!
  5. Elastic 技术栈之 Filebeat
  6. paip.提升开发效率---增量备份项目文件
  7. 20165223 《JAVA程序设计》第三周学习总结
  8. unityar自动识别人脸_unity人脸识别源码Dlib FaceLandmark Detector
  9. openGL 例子:创建一个二十面体
  10. Spark应用提交后一直不运行:hadoop-yarn ACCEPTED: waiting for AM container to be allocated, launched and registe
  11. 王道数据结构3.3.6——2、铁道进行车厢调度,将一辆列车的硬座车厢都调到软坐车厢后面
  12. 力扣刷题 DAY_82 贪心
  13. Android 显示软键盘输入法和强制隐藏软键盘输入法
  14. xargs -i参数详解
  15. 人人都能懂的贝叶斯统计:原理与实践
  16. android点击展开全文,Android显示全文折叠控件使用方法详解
  17. 怎么把图片的分辨率调高?如何调整图片分辨率?
  18. 创建程序编写demo.py文件
  19. oracle 12 c盘已共享,求助,12c使用iscsi作为共享存储的问题,数据不同步 - Oracle论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  20. 《Python语言程序设计》王恺 王志 机械工业出版社 第五章 序列、集合和字典 课后习题答案

热门文章

  1. (0069)iOS开发之dequeueReusableCellWithIdentifier的两个方法的区别
  2. HTML/CSS快速入门
  3. Scrapy+Scrapy-redis+Scrapyd+Gerapy 分布式爬虫框架整合
  4. Codeforces 479【E】div3
  5. Could not find the main class: org.apache.catalina.startup.Boostrap. Program will exit.
  6. 细聊 Cocoapods 与 Xcode 工程配置
  7. Python【Python基础】
  8. Chosen中选择项的更新
  9. JAVA I/O系统。
  10. 串口基础类库(WIN32)异步通信 _COM_H 源代码