linux中创建目录树,如何在C++/Linux中创建目录树?

Jonathan Lef..

58

这是一个可以用C++编译器编译的C函数.

/*

@(#)File: $RCSfile: mkpath.c,v $

@(#)Version: $Revision: 1.13 $

@(#)Last changed: $Date: 2012/07/15 00:40:37 $

@(#)Purpose: Create all directories in path

@(#)Author: J Leffler

@(#)Copyright: (C) JLSS 1990-91,1997-98,2001,2005,2008,2012

*/

/*TABSTOP=4*/

#include "jlss.h"

#include "emalloc.h"

#include

#ifdef HAVE_UNISTD_H

#include

#endif /* HAVE_UNISTD_H */

#include

#include "sysstat.h" /* Fix up for Windows - inc mode_t */

typedef struct stat Stat;

#ifndef lint

/* Prevent over-aggressive optimizers from eliminating ID string */

const char jlss_id_mkpath_c[] = "@(#)$Id: mkpath.c,v 1.13 2012/07/15 00:40:37 jleffler Exp $";

#endif /* lint */

static int do_mkdir(const char *path, mode_t mode)

{

Stat st;

int status = 0;

if (stat(path, &st) != 0)

{

/* Directory does not exist. EEXIST for race condition */

if (mkdir(path, mode) != 0 && errno != EEXIST)

status = -1;

}

else if (!S_ISDIR(st.st_mode))

{

errno = ENOTDIR;

status = -1;

}

return(status);

}

/**

** mkpath - ensure all directories in path exist

** Algorithm takes the pessimistic view and works top-down to ensure

** each directory in path exists, rather than optimistically creating

** the last element and working backwards.

*/

int mkpath(const char *path, mode_t mode)

{

char *pp;

char *sp;

int status;

char *copypath = STRDUP(path);

status = 0;

pp = copypath;

while (status == 0 && (sp = strchr(pp, '/')) != 0)

{

if (sp != pp)

{

/* Neither root nor double slash in path */

*sp = '\0';

status = do_mkdir(copypath, mode);

*sp = '/';

}

pp = sp + 1;

}

if (status == 0)

status = do_mkdir(path, mode);

FREE(copypath);

return (status);

}

#ifdef TEST

#include

/*

** Stress test with parallel running of mkpath() function.

** Before the EEXIST test, code would fail.

** With the EEXIST test, code does not fail.

**

** Test shell script

** PREFIX=mkpath.$$

** NAME=./$PREFIX/sa/32/ad/13/23/13/12/13/sd/ds/ww/qq/ss/dd/zz/xx/dd/rr/ff/ff/ss/ss/ss/ss/ss/ss/ss/ss

** : ${MKPATH:=mkpath}

** ./$MKPATH $NAME &

** [...repeat a dozen times or so...]

** ./$MKPATH $NAME &

** wait

** rm -fr ./$PREFIX/

*/

int main(int argc, char **argv)

{

int i;

for (i = 1; i < argc; i++)

{

for (int j = 0; j < 20; j++)

{

if (fork() == 0)

{

int rc = mkpath(argv[i], 0777);

if (rc != 0)

fprintf(stderr, "%d: failed to create (%d: %s): %s\n",

(int)getpid(), errno, strerror(errno), argv[i]);

exit(rc == 0 ? EXIT_SUCCESS : EXIT_FAILURE);

}

}

int status;

int fail = 0;

while (wait(&status) != -1)

{

if (WEXITSTATUS(status) != 0)

fail = 1;

}

if (fail == 0)

printf("created: %s\n", argv[i]);

}

return(0);

}

#endif /* TEST */

这些宏是STRDUP()and FREE()的错误检查版本,strdup()并free()在emalloc.h(并在emalloc.c和中实现estrdup.c)声明.该"sysstat.h"用的破碎版本头交易,并且可以被替换为现代Unix系统上(但在1990年出现了许多问题后).并"jlss.h"宣布mkpath().

v1.12(上一个)和v1.13(上面)之间的变化是EEXISTin 的测试do_mkdir().Switch指出这是必要的- 谢谢你,Switch.测试代码已经升级并在MacBook Pro(2.3GHz Intel Core i7,运行Mac OS X 10.7.4)上重现了问题,并建议在修订版中修复问题(但测试只能显示错误的存在) ,从不他们缺席).

(特此允许您将此代码用于任何归属目的.)

这个代码中有一个微妙的竞争条件,我实际上已经击中了.它只发生在多个程序同时启动并生成相同的文件夹路径时.修复是添加`if(errno!= EEXIST){status = -1; 当mkdir失败时. (7认同)

它肯定比系统更快.系统涉及很多开销.基本上,进程必须分叉,然后必须至少加载两个二进制文件(一个可能已经在缓存中),其中另一个是另一个的另一个分支,... (2认同)

@Switch:谢谢.这是在`mkdir()`之前使用`stat()`的麻烦; 这是TOCTOU(检查时间,使用时间)问题.我尝试使用在后台运行13个进程的shell脚本来创建相同的29个元素的路径,并且无法点击它.然后我把测试程序分成20次,让每个孩子尝试,然后设法击中了这个bug.固定代码将具有`if(mkdir(path,mode)!= 0 && errno!= EEXIST)status = -1;`.这没有显示错误. (2认同)

@DavidMerinos:它们是头文件(jlss.h,emalloc.h),而不是库。但是,该代码在GitHub上的[SOQ](https://github.com/jleffler/soq)(堆栈溢出问题)存储库中可用,分别为文件`jlss.h`,`emalloc.c`和`emalloc.h。在[src / libsoq](https://github.com/jleffler/soq/tree/master/src/libsoq)子目录中。您还需要`posixver.h`,以及其他一些(`debug.h`,`stderr.c`,`stderr.h-我想就是这样,但是您所需要的都应该在该目录中) 。 (2认同)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux socket bind 内核详解,Socket与系统调用深度分析(示例代码)

1、 什么是系统调用操作系统通过系统调用为运行于其上的进程提供服务。当用户态进程发起一个系统调用&#xff0c; CPU 将切换到 内核态 并开始执行一个 内核函数 。 内核函数负责响应应用程序的要求&#xff0c;例如操作文件、进行网络通讯或者申请内存资源等。在Linux中系统调…

【UVA - 11729】Commando War (贪心,时间调度问题)

题干&#xff1a;&#xff08;Uva不放题干了&#xff09; 题目大意&#xff1a;&#xff08;实在是自己懒得写网上找了一个&#xff09; 解题报告&#xff1a; 调度问题&#xff0c;直接贪心出完成任务需要的时间最长的那个人排序&#xff0c;就行了。 方法正确性的证明以前也…

【UVA - 1335】Beijing Guards (贪心,二分)

题干&#xff1a; 题目大意&#xff1a; 有n个人为成一个圈&#xff0c;其中第i个人想要r[i]种不同的礼物&#xff0c;相邻的两个人可以聊天&#xff0c;炫耀自己的礼物。如果两个相邻的人拥有同一种礼物&#xff0c;则双方都会很不高兴&#xff0c;问最少需要多少种不同的礼…

linux两个命令一起,paste命令 – 合并两个文件

paste命令会把每个文件以列对列的方式&#xff0c;一列列地加以合并 &#xff0c;他就是相当于把两个不同的文件内容粘贴在一起&#xff0c;形成新的文件。注意&#xff1a;paste默认粘贴方式以列的方式粘贴&#xff0c;但是并不是不能以行的方式粘贴&#xff0c;加上-s选项就可…

【UVA - 11292】Dragon of Loowater (贪心,水题,模拟,twopointer双指针)

题干&#xff1a; 题目大意&#xff1a; n条恶龙&#xff0c;m个勇士&#xff0c;用勇士来杀恶龙。一个勇士只能杀一个恶龙。而且勇士只能杀直径不超过自己能力值的恶龙。每个勇士需要支付能力值一样的金币。问杀掉所有恶龙需要花费的最少金币。 解题报告&#xff1a; twopo…

linux 命令pg,linux下操作PostgreSQL的常用命令

一般性&#xff1a;\copyright 显示PostgreSQL的使用和发行许可条款\g [文件] or; 执行查询 (并把结果写入文件或 |管道)\h [名称] SQL命令语法上的说明&#xff0c;用*显示全部命令的语法说明\q 退出 psql查询缓存区\e [FILE] [LINE] 使用外部编辑器编辑查询缓存区(或文件)\ef…

【UVA - 10037】Bridge(过河问题,经典贪心)

题干&#xff1a; 题目大意&#xff1a; 有N个人要过桥&#xff0c;每个人速度不同&#xff0c;只有一个手电筒&#xff0c;每次最多只能过去两个人&#xff0c;问所有人最短的过桥时间为多少 解题报告&#xff1a; 首先让最快的两个人最后过&#xff0c;然后我们分奇偶考虑…

linux系统键盘记录器,可截获到 QQ 密码 键盘记录器源码

由于 QQ 密码做了特殊的保护&#xff0c;所以通过远程注入得到密码框内容以及通过钩子来得到键盘消息均不能探测到 QQ 的密码&#xff0c;但是通过对键盘驱动的过滤却是可以记录下 QQ 密码输入期间的内容&#xff0c;附上源码。#define DBG 1#include #include #include "…

【牛客 - 2B】树(思维,dp,有坑)

题干&#xff1a; shy有一颗树&#xff0c;树有n个结点。有k种不同颜色的染料给树染色。一个染色方案是合法的&#xff0c;当且仅当对于所有相同颜色的点对(x,y)&#xff0c;x到y的路径上的所有点的颜色都要与x和y相同。请统计方案数。 输入描述: 第一行两个整数n&#xf…

linux安装后启动mysql,linux安装完mysql后启动错误

redhat as 4,使用rpm包安装完mysql的server 跟client后执行以下命令出错。[rootftp etc]# /usr/bin/mysqladmin -u root password new-password/usr/bin/mysqladmin: connect to server at localhost failederror: Cant connect to local MySQL server through socket /var/lib…

linux exchange邮件客户端,Linux中使用Hiri邮件客户端访问Exchange帐户

大家都知道 Microsoft Exchange 是企业级邮件市场占有率第一的产品&#xff0c;早已成为 Top 500 企业首选的邮件服务器和客户端标准配备。随着 Office 365 服务在全球的铺开&#xff0c;Exchange 的市场占有率更是越来越高&#xff0c;不少中小企业甚至个人用户都已经开始使用…

【CodeForces - 1084C】The Fair Nut and String(思维,组合数学)

题干&#xff1a; The Fair Nut found a string ss. The string consists of lowercase Latin letters. The Nut is a curious guy, so he wants to find the number of strictly increasing sequences p1,p2,…,pkp1,p2,…,pk, such that: For each ii (1≤i≤k1≤i≤k), sp…

群辉挂载linux nfs,Debian 9 挂载访问已设置的群晖NFS共享文件目录

说明博主先后尝试了 webdav、Samba方案后&#xff0c;最后毅然决然选择NFS的方案&#xff0c;通过挂载群晖的NFS共享文件目录作为Jellyfin的媒体库&#xff0c;媒体播放通常单个文件都比较大&#xff0c;而webdav在读取过程中需要比较长的缓存时间大文件传输并不友好。之前试过…

【牛客 - 289H】约会(思维,数学,奇偶数,水题)

题干&#xff1a; Hang等了一年&#xff0c;终于&#xff0c;朝气蓬勃的小学妹来了&#xff0c;在开学当天&#xff0c;就成功打入协会迎新群&#xff0c;在Hang的魅力&#xff08;死皮赖脸&#xff09;之下&#xff0c;有个小学妹要和他面基了&#xff0c;小学妹说&#xf…

c语言中调试时go的作用,C语言调用GO

C语言调用GO最近工作中遇到需要在c语言里面调用go语言的需求&#xff0c;总结了一下&#xff0c;下面代码里面的每一个注释都很有用&#xff0c;闲话不多说&#xff0c;直接上代码~示例GO代码&#xff1a;package main // 这个文件一定要在main包下面import "C" // 这…

【CodeForces - 768C】Jon Snow and his Favourite Number(思维,技巧,套路,数学异或,循环节,trick)

题干&#xff1a; Jon Snow now has to fight with White Walkers. He has n rangers, each of which has his own strength. Also Jon Snow has his favourite number x. Each ranger can fight with a white walker only if the strength of the white walker equals his st…

C语言第六次作业指针,c语言第六次作业解析

《c语言第六次作业解析》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《c语言第六次作业解析(36页珍藏版)》请在人人文库网上搜索。1、c 语言第六次作业解析第六次作业&#xff1a;指针(以下题目如无特殊声明&#xff0c; 请使用指针技术实现 , 尽量不要使用数组作为…

【HDU - 1069】Monkey and Banana (最长下降子序列 + 贪心,最长上升子序列类问题)

题干&#xff1a; A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, provide the monkey with some blocks. If the monkey is clever enough, it shall be able …

c 语言定义2维字符串数组赋值,二维数组赋值字符串 c 语言 二维字符串数组赋值问题...

C语言中二维字符数组应该怎样赋值&#xff1f;c语言二维数组如何定义字符串&#xff1f;&#xff1f;&#xff1f;&#xff1f;急。。。二维字符数组的定义格式为&#xff1a;char 数组名[第一维大小][第二维大小]; 例如&#xff1a;char c[3][10]; //定义了一个3行10列的二维字…

【牛客 - 297D】little w and Exchange(上下界贪心)

题干&#xff1a; 旅行到K国的小w发现K国有着很多物美价廉的商品&#xff0c;他想要买一些商品。 结果一掏钱包&#xff0c;包里只剩下n张K国的纸币了&#xff0c;说起来也奇怪&#xff0c;K国纸币并不像其他国家一样都是1元&#xff0c;5元&#xff0c;10元…而是各种奇怪的…