首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash > redirection是原子的吗?

bash > redirection是原子的吗?
EN

Stack Overflow用户
提问于 2015-08-18 23:53:58
回答 3查看 690关注 0票数 3

我的crontab工作出了点奇怪的问题。我的crontab作业执行以下操作:

代码语言:javascript
复制
program > file

然而,有时文件中充满了我无法解释的随机数据。

我想知道是不是以前的crontab作业运行时间较长,并且以某种方式将其在file中的结果与当前的crontab作业混合在一起?

总的来说,我的问题是:>操作是原子的吗?这意味着如果两个程序执行> file,那么最后一个完成的程序将以file格式存储其数据

EN

回答 3

Stack Overflow用户

发布于 2015-08-19 00:15:00

不,它不是原子的。一点都不是原子的。

重定向做两件事:

  1. 它会按名称打开文件,必要时会创建它。
  2. 它会截断文件。

然后,启动该实用程序,并将其stdin分配给打开的文件。

如果两个脚本或多或少同时这样做,它们最终都会写入同一个文件,但由于它们将具有独立的文件描述符,因此每个进程将覆盖另一个进程的输出,从而导致大量字节的交错,其中一些来自一个进程,另一些来自另一个进程。

另一个常见的争用情况与文件在实用程序开始执行之前被截断(被shell)的事实有关。因此,即使该实用程序只向文件写入一行,读取该文件的并发实用程序也可能会发现它是空的。

票数 4
EN

Stack Overflow用户

发布于 2015-08-19 00:15:17

它不是原子的。您可以自己轻松地进行验证:

代码语言:javascript
复制
( { echo a ; sleep 3; echo b ; } > 1) &
( { echo c ; sleep 1 ; echo d ; } > 1 )&

sleep 5 ; cat 1
票数 2
EN

Stack Overflow用户

发布于 2015-08-19 00:18:31

bash >是使用带有标志(至少对于bash 4.3.30 ) O_TRUNC | O_WRONLY | O_CREAT (来自make_cmd.c的第707行)的open完成的。

因此,每个都会截断文件,并向其写入。如果前一个进程仍然具有打开的文件句柄,它将继续写入文件,并在其查找位置写入文件,而不知道另一个进程已截断该文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32077127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档