gpt4 book ai didi

c++ - 写入文件和 mkdir 竞争条件 C

转载 作者:太空宇宙 更新时间:2023-11-04 04:18:35 26 4
gpt4 key购买 nike

我创建了一个尝试创建目录的函数,然后编写一个简单的文件:

buffer = "Hello world!";
string url = "a/b/c/d/";
string tmp = "";
string done = "";
while((tmp = GetBaseDir(url)).compare("")!=0){
done+=tmp;
mkdir(done.c_str(), 0777);
} // GetBaseDir returns "a/", and changes url to "b/c/d/"
ofstream file;
file.open((url+"file.txt").c_str(),ios::trunc);
file << buffer;
file.close();

正如您所看到的,它只会尝试,如果失败,它就会继续下去。

我读到,如果另一个进程以写权限打开同一文件,“打开”将会失败。但是,这是真的吗?
如果我同时运行此代码的多个实例,mkdir 和写入操作会发生什么情况?

最佳答案

手册页指出,当目录已存在时,mkdir 会失败。它返回 -1 而不是 0。如果忽略这一点,只要 a/b/c/d 实际上是目录,您的代码通常可以正常工作。竞争进程可能会将它们创建为其他内容,从而导致错误。目前尚不清楚为什么使用模式 0777,因为使用 0700 甚至 0770 与特殊组会更好。如果您确定它们始终是目录,那么代码的每个实例都将确保 dir 路径存在,并且唯一的争用将是创建文件。

NAME
mkdir -- make a directory file
SYNOPSIS
#include <sys/stat.h>
int mkdir(const char *path, mode_t mode);
RETURN VALUES
A 0 return value indicates success. A -1 return value indicates an
error, and an error code is stored in errno.
ERRORS
Mkdir() will fail and no directory will be created if:
...
[EEXIST] The named file exists.

关于c++ - 写入文件和 mkdir 竞争条件 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14865338/

26 4 0
文章推荐: HTML 标签!删除新段落</a> </div> <div> 文章推荐: <a class="a-tag" href="/article/22/2780373/detail.html" target="_blank">linux - geniso 与 hfsbless 不工作</a> </div> <div> 文章推荐: <a class="a-tag" href="/article/22/2780371/detail.html" target="_blank">python - 如何绘制任意一点抛物线的斜率(切线)?</a> </div> <div> 文章推荐: <a class="a-tag" href="/article/22/2780370/detail.html" target="_blank">javascript - 防止svg边框渐变颜色</a> </div> </div> <div class="content-p"> <ul class="like-article"> <li> <a class="a-tag" href="/article/23/6480068/detail.html" target="_blank">Java mkdir + mkdirs 总是返回 false</a> <p>我正在尝试在 Java 中创建一个新目录,但它不起作用。我想知道为什么,因为我首先尝试了 mkdir() ,然后尝试了 mkdirs() ,它应该创建不存在的目录。 我写道: boolean stat</p> </li> <li> <a class="a-tag" href="/article/23/8342852/detail.html" target="_blank">unix - mkdir 和 mkdir -p 有什么区别</a> <p>我尝试使用 mkdir 在本地 git 存储库中创建文件夹。它没有用,但是mkdir -p 有效。 为什么? 顺便说一句,我正在使用 Mac 操作系统。我检查了 mkdir -p 的定义。但是我还是不</p> </li> <li> <a class="a-tag" href="/article/23/6927422/detail.html" target="_blank">powershell - mkdir 和 mkdir -p 之间的区别?</a> <p>我一直在关注 Learn Code the Hard Way 的教程,了解如何在 PowerShell 中使用命令行界面。在 this文章中,它告诉我使用命令 mkdir -p i\like\icec</p> </li> <li> <a class="a-tag" href="/article/23/4799701/detail.html" target="_blank">java - 不使用 mkdir() 或 mkdirs() 创建的目录</a> <p>下面是我的 MainActivity.java 代码。根据 toasts 的错误是在创建目录时。 主 Activity .java @Override protected void onActivit</p> </li> <li> <a class="a-tag" href="/article/21/1825982/detail.html" target="_blank">android - File.mkdir() 和 mkdirs() 正在创建文件而不是目录</a> <p>我使用以下代码: final File newFile = new File("/mnt/sdcard/test/"); newFile.mkdir(); // if I use mkdirs() r</p> </li> <li> <a class="a-tag" href="/article/14/305285/detail.html" target="_blank">Android:外部存储上的 mkdirs()/mkdir() 返回 false</a> <p>我被这个逼疯了: Log.d("STATE", Environment.getExternalStorageState()); File f = new File(Environment.getExt</p> </li> <li> <a class="a-tag" href="/article/21/2019472/detail.html" target="_blank">c++ - 为什么使用 mkdir() 函数比使用系统 ('mkdir path' 快得多)?</a> <p>我正在创建一个应用程序,我需要创建多个文件夹,而且创建文件夹是一步到位的。 要做最优化,然后我意识到 mkdir() 比 system('mkdir path') 快得多; 有谁知道原因吗? 最佳答案</p> </li> <li> <a class="a-tag" href="/article/21/1932634/detail.html" target="_blank">linux - "mkdir || echo && exit"即使 mkdir 成功退出</a> <p>mkdir $2 || echo "I can't create directory $2" && exit 8 大家好,这是我在这里的第一篇文章,请多多关照。 我现在正在制作一个脚本,这一行让我很困</p> </li> <li> <a class="a-tag" href="/article/20/1662263/detail.html" target="_blank">php - 警告 (2) : mkdir() [function. mkdir]: 没有那个文件或目录</a> <p>您好,我最近遇到了这个问题,但能够解决它。实际上路径中的拼写错误。我想知道如何正确处理这些错误。也就是说,如果 mkdir 失败,我的程序应该继续执行并且应该安全地返回 false。这是我的代码 tr</p> </li> <li> <a class="a-tag" href="/article/14/242021/detail.html" target="_blank">linux - os.Mkdir 和 os.Mkdir 所有权限</a> <p>我正在尝试在我的程序开始时创建一个日志文件。 如果 /log 目录没有创建目录,我需要检查它是否存在,然后继续创建日志文件。 好吧,我尝试使用 os.Mkdir(以及 os.MkdirAll),但无论</p> </li> <li> <a class="a-tag" href="/article/23/4042401/detail.html" target="_blank">android - mkdir() 或 mkdirs() 不适用于 Android API 26</a> <p>以下代码可与其他 API 一起使用,但 26 public static boolean cretaeDir() { String dir = Environment.getExternalS</p> </li> <li> <a class="a-tag" href="/article/20/1652127/detail.html" target="_blank">php - 警告 : mkdir() [function. mkdir] : No such file or directory PHP?</a> <p>尝试在 PHP 中使用 mkdir() 函数时出现此错误。 基本上,我是在我的服务器上创建一个基于 input field 的 HTML 表单中名为 (inPut) 的 sundomain。 现在我正</p> </li> <li> <a class="a-tag" href="/article/14/280359/detail.html" target="_blank">java - File.mkdir 或 mkdirs 返回 false - 原因?</a> <p>为什么 file.mkdir 返回 false? Google 指出可能有多种原因(例如安全性、权限、路径名等)。 我的问题: 如何找到返回false的确切原因? 如果安全/权限是一个原因,那么为什么</p> </li> <li> <a class="a-tag" href="/article/22/2248343/detail.html" target="_blank">python - 使用 os.mkdir 与 os.system ("mkdir"的好处)</a> <p>我找不到答案的简单问题: 使用 os.mkdir("somedir") 比 os.system("mkdir somedir") 或 subprocess.call() 有好处吗,超越代码可移植性? </p> </li> <li> <a class="a-tag" href="/article/18/714346/detail.html" target="_blank">Android 4.4.2 File.mkdir() 和 mkdirs() 正在创建文件而不是目录</a> <p>这个问题与this question无关.我已经看到它了,但它是特定的 Android 4.4.2 问题,因为该代码在其他版本的 Android 上运行良好。 final File path = ne</p> </li> <li> <a class="a-tag" href="/article/15/406570/detail.html" target="_blank">go - os.Mkdir 与 syscall.Mkdir,在 Golang 中有什么区别?</a> <p>os.Mkdir 和 syscall.Mkdir 在 Golang 中有相同的 API 系统调用.Mkdir: func Mkdir(path string, mode uint32) (err er</p> </li> <li> <a class="a-tag" href="/article/14/212449/detail.html" target="_blank">java - java.io.File 中 mkdir() 和 mkdirs() 的区别</a> <p>已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 要求代码的问题必须表明对正在解决的问题的最低理解。包括尝试的解决方案、它们为什么不起作用以及预期结果。另</p> </li> <li> <a class="a-tag" href="/article/22/3023955/detail.html" target="_blank">python - 什么时候应该使用 pathlib.Path.mkdir() 与 os.mkdir() 或 os.makedirs()?</a> <p> 这个问题在这里已经有了答案: What is different between makedirs and mkdir of os? (3 个答案) 关闭 9 个月前。 根据 python 3.6 </p> </li> <li> <a class="a-tag" href="/article/22/2803982/detail.html" target="_blank">python - 为什么 python 中的 os.mkdir 设置权限的方式与 bash 中的 mkdir 之一不同?</a> <p>我通过 bash 中的 mkdir 和 python 中的 os.mkdir 使用文件模式创建了目录。他们制作了具有不同权限的目录。 我在命令行中的测试代码如下, $ mkdir -m 0775 aa</p> </li> <li> <a class="a-tag" href="/article/22/2995992/detail.html" target="_blank">linux - mkdir : missing operand - ssh -tt ${REMOTE_SERVER} sudo sh -c "mkdir -p/opt/migration"</a> <p>给定: MIGRATION_FOLDER=/opt/migration 要么这样: ssh -tt ${REMOTE_SERVER} sudo sh -c "mkdir -p /opt/migrati</p> </li> </ul> </div> </div> <div class="resource col-xs-3 col-sm-3 col-md-3 col-lg-3"> <div class="content-p content-p-comment"> <div class="phone-current phone-current-float"> <img alt="" src="/images/phone/manphone.jpeg"> </div> <div class="phone-current-float phone-current-style"> 太空宇宙 </div> <div class="phone-current-summary"> <span><strong>个人简介</strong></span> <p> 我是一名优秀的程序员,十分优秀! </p> </div> </div> <div class="content-p content-p-comment"> <article class="p-list"> <div class="art-margin" style="border-bottom: 1px solid #f3f0f0; padding-bottom: 5px;"> <strong>作者热门文章</strong> </div> <ul class="recomment-list-user"> <li><a class="a-tag" href="/article/22/2177999/detail.html" target="_blank">android - 多次调用 OnPrimaryClipChangedListener</a></li> <li><a class="a-tag" href="/article/22/2177998/detail.html" target="_blank">android - 无法更新 RecyclerView 中的 TextView 字段</a></li> <li><a class="a-tag" href="/article/22/2177997/detail.html" target="_blank">android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0</a></li> <li><a class="a-tag" href="/article/22/2177996/detail.html" target="_blank">android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色</a></li> </ul> </article> </div> <div class="content-p content-p-comment"> <article class="p-list"> <div class="art-margin" style="border-bottom: 1px solid #f3f0f0; padding-bottom: 5px;"> <strong>滴滴打车优惠券免费领取</strong> </div> <img alt="滴滴打车优惠券" src="/images/ad/didiad.png" width="210px" onclick="window.open('/ad/didi', '_blank')"> </article> </div> <div class="content-p content-p-comment"> <article class="p-list"> <div class="art-margin" style="border-bottom: 1px solid #f3f0f0; padding-bottom: 5px;"> <strong>全站热门文章</strong> </div> <ul class="recomment-list-user"> <li><a class="a-tag" href="/article/92/8828090/detail.html" target="_blank">巧用mask属性创建一个纯CSS图标库</a></li> <li><a class="a-tag" href="/article/92/8828089/detail.html" target="_blank">Java代码覆盖率super-jacoco</a></li> <li><a class="a-tag" href="/article/92/8828088/detail.html" target="_blank">armmattermost</a></li> <li><a class="a-tag" href="/article/92/8828087/detail.html" target="_blank">Vulnhub经典靶机:from_sqli_to_shell_i386入门靶机</a></li> <li><a class="a-tag" href="/article/92/8828086/detail.html" target="_blank">【Rive】波动文字</a></li> <li><a class="a-tag" href="/article/92/8828085/detail.html" target="_blank">Vscode实现应用qss样式表</a></li> <li><a class="a-tag" href="/article/92/8828084/detail.html" target="_blank">DocforDevNow</a></li> <li><a class="a-tag" href="/article/92/8828083/detail.html" target="_blank">干掉EasyExcel!FastExcel初体验</a></li> <li><a class="a-tag" href="/article/92/8828082/detail.html" target="_blank">爬虫自动化脚本+AI赋能</a></li> <li><a class="a-tag" href="/article/92/8828081/detail.html" target="_blank">快手后端面试,被面试官秒挂了!</a></li> </ul> </article> </div> </div> </div> </div> <div class="foot-font" style="border-top: 1px solid #f3f0f0; margin: auto; padding: 15px; background-color: #474443" align="center"> <a href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank"><span class="color-txt-foot">Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号</span></a> <br/> <a href="/" target="_blank"><span class="color-txt-foot">广告合作:1813099741@qq.com</span></a> <a href="http://www.6ren.com" target="_blank"><span class="color-txt-foot">6ren.com</span></a> </div> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d1cb9c185f1642d6f07e22cafa330c45"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d46c26b2162aface49b8acf6cb7025e1"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </body> </html>