linux C实现mkdir功能

一:背景

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 a
 pointer to static storage that may then be overwritten by subsequent calls to dirname().
最终还是通过printf打印调试的,没有借助gdb,主要还是这家伙用起来不舒服。

linux C实现mkdir功能,布布扣,bubuko.com

时间: 2024-10-23 13:28:09

linux C实现mkdir功能的相关文章

Linux系统中cgroup功能介绍

1  Cgroups简介 1.1 What are cgroups ? Cgroups(控制组)是Linux内核的一个功能,用来限制.统计和分离一个进程组的资源(CPU.内存.磁盘输入输出等).换句话说就是,如果一个进程加入了某一个控制组,该控制组对Linux的系统资源都有严格的限制,进程在使用这些资源时,不能超过其最大的限制数,例如:memory资源,如果加入控制组的进程使用的memory大于其限制,可能会出现OOM错误(关于OOM错误可参看Linux内核OOM机制分析).cgroup本身提供

Red Hat Enterprise Linux 7的新功能

?? 简介红帽最新版本的旗舰平台交付显著增强的可用性. 性能和可靠性. 丰富的新功能为架构. 系统管理员和开发人员提供所需的资源以更高效地进行创新和管理.架构师: 红帽® 企业 Linux® 7 适合您选择的任意基础架构, 它可以高效地与其他操作环境. 身份验证和管理系统集成到一起. 无论您是要构建网络密集型应用程序. 可大规模扩展的数据资料库, 亦或是一次构建而成但会频繁部署的并在物理. 虚拟和云环境中表现良好的解决方案, 红帽企业 Linux 7 都提供了必要的功能来支持您的项目.系统管理员

linux目录操作命令 mkdir

linux目录操作命令 mkdir 新建 linux运维,常用命令 目录 mkdir 命令 语法 选项 参数 实例 mkdir 命令 mkdir 命令用来创建目录.如果在目录名的前面没有加任何路径名,则在当前目录下创建由dirname指定的目录:如果给出了一个已经存在的路径,将会在该目录下创建一个指定的目录.在创建目录时,应保证新建的目录与它所在目录下的文件没有重名. 语法 mkdir[选项] 选项 -Z:设置安全上下文,当使用SELinux时有效: -m<目标属性>或--mode<目标

php -- 实现linux关机、重启功能

有时候,我们自己可以DIY一个控制面板实现linux的关机重启功能.众所周知,linux是一个基于文件的操作系统,所以要实现系统的关机重启功能必须满足以下两点 一.知道命令的绝对路径 在linux下操作的时候,我们们直接敲入命令即可.但用PHP执行linux命令就不能这么操作了,需要知道命令的绝对路径. 重启命令reboot绝对路径/sbin/reboot关机命令shutdown绝对路径/sbin/shutdown 二.用PHP执行linux命令 有许多函数,之前我有些过博文介绍.这里推荐使用e

Linux学习—LVM快照功能

LVM快照功能--我们知道LVM能够通过增减PE的数量来弹性调整文件系统的大小,除此之外,LVM还有另外一个重要的功能,LV磁盘快照,就是通过快照的功能将此时的文件系统信息记录下来,以后对该文件系统操作的时候,当该文件系统的数据变化的时候,我们可以利用快照将文件系统恢复至当时的状态. 目录 LV的快照原理 创建快照 利用快照恢复系统 一.LV的快照(snapshot)原理 左边的图表示,LVM会在VG上预留一定的区域作为快照区,原本lv中存放着数据,同时快照区存放着lv中元数据,因此快照区大小不

Linux命令学习-mkdir命令

Linux中,mkdir命令的全称是make directory,即创建目录的意思. 假设当前处于wintest用户的主目录,路径为 /home/wintest ,存在文件夹testA,进入testA 在testA目录下,新建文件夹testB mkdir testB 当前用户主目录下,创建多个文件夹 mkdir -p testA2/testB2 通过 -p 参数可以一次性创建多层目录,该命令在当前路径下创建了新文件夹testA2,同时在testA2下创建了子文件夹testB2. 在testA目录

Linux 常用命令-mkdir

linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 1.命令格式: mkdir [选项] 目录... 2.命令功能: 通过 mkdir 命令可以实现在指定位置创建以 DirName(指定的文件名)命名的文件夹或目录.要创建文件夹或目录的用户必须对所创建的文件夹的父文件夹具有写权限.并且,所创建的文件夹(目录)不能与其父目录(即父文件夹)中的文件名重名,即同一个目录下不能有同名的(区分大小写). 3.命令参数

(转)每天一个Linux命令(4): mkdir

http://www.cnblogs.com/peida/archive/2012/10/25/2738271.html linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 1.命令格式: mkdir [选项] 目录... 2.命令功能: 通过 mkdir 命令可以实现在指定位置创建以 DirName(指定的文件名)命名的文件夹或目录.要创建文件夹或目录的用户必须对所创建的文件夹的父文件夹具有写权限.并且,

linux系统的加密功能及OpenSSL使用

一.密码学简介 据记载,公元前400年,古希腊人发明了置换密码.1881年世界上的第一个电话保密专利出现.在第二次世界大战期间,德国军方启用"恩尼格玛"密码机,密码学在战争中起着非常重要的作用. 随着信息化和数字化社会的发展,人们对信息安全和保密的重要性认识不断提高,于是在1997年,美国国家标准局公布实施了"美国数据加密标准(DES)",民间力量开始全面介入密码学的研究和应用中,采用的加密算法有DES.RSA.SHA等.随着对加密强度需求的不断提高,近期又出现了A