标签: write

“是”如何如此快速地写入文件?

让我举个例子吧:

$ timeout 1 yes "GNU" > file1
$ wc -l file1
11504640 file1
Run Code Online (Sandbox Code Playgroud)

$ for ((sec0=`date +%S`;sec<=$(($sec0+5));sec=`date +%S`)); do echo "GNU" >> file2; done
$ wc -l file2
1953 file2
Run Code Online (Sandbox Code Playgroud)

在这里您可以看到该命令在一秒钟内yes写入11504640行,而我只能1953在 5 秒内使用 bashforecho.

正如评论中所建议的,有各种技巧可以提高效率,但没有一个能与以下速度相媲美yes

$ ( while :; do echo "GNU" >> file3; done) & pid=$! ; sleep 1 ; kill $pid
[1] 3054
$ wc -l file3
19596 file3
Run Code Online (Sandbox Code Playgroud)

$ timeout 1 bash -c 'while …
Run Code Online (Sandbox Code Playgroud)

bash coreutils write yes

61
推荐指数
3
解决办法
8823
查看次数

如何在 Linux 中获得总读取和总写入 IOPS?

如何在 Linux 中使用命令行或以编程方式分别获得读写 IOPS?我已经安装了sysstat包。

请告诉我如何使用sysstat包命令分别计算这些。

或者,是否可以使用文件系统计算它们?

例如: /proc/sys/dev

linux io disk read write

39
推荐指数
1
解决办法
16万
查看次数

从一个终端用户向另一个用户发送消息

我在 tty1 中有一个名为 x 的用户,在 tty2 中有一个名为 y 的用户。现在 x 想给 y 写一些消息,反之亦然。现在我在 tty1 终端输入write y tty2 它显示

写:写:你有写权限关闭

write:y 已禁用消息

当 y 向 x 发送消息时显示相同的内容,而不是最后一行中的“x”。我该怎么办?

terminal tty write

12
推荐指数
1
解决办法
6万
查看次数

覆盖正在运行的可执行文件或 .so

我有一个关于覆盖正在运行的可执行文件或覆盖一个或多个正在运行的程序正在使用的共享库 (.so) 文件的问题。

过去,出于显而易见的原因,覆盖正在运行的可执行文件是行不通的。甚至还有一个特定的 errno 值 ETXTBSY,它涵盖了这种情况。

但现在相当长一段时间,我注意到,当我不小心尝试覆盖正在运行的可执行文件(例如,通过发射了一个构建,其最后一步是cc -o exefile对的exefile,恰好运行),它的工作原理!

所以我的问题是,这是如何工作的,是否在任何地方都有记录,依赖它是否安全?

看起来有人可能已经调整ld以取消链接其输出文件并创建一个新文件,只是为了消除这种情况下的错误。我不太清楚它是一直在这样做,还是仅在需要时才这样做(也就是说,可能是在它尝试覆盖现有文件并遇到 ETXTBSY 之后)。而且我在ld的手册页上没有看到任何提及。(我想知道为什么人们不抱怨ld现在可能会破坏他们的硬链接,或者改变文件所有权,等等。)


附录:这个问题并不是专门关于cc/ ld(尽管这最终成为答案的重要部分);问题真的只是“为什么我再也看不到 ETXTBSY?它仍然是一个错误吗?” 答案是,是的,它仍然是一个错误,只是在实践中很少见。(另请参阅我刚刚发布到我自己的问题的澄清答案。)

executable write ld

7
推荐指数
1
解决办法
2978
查看次数

如何将命令输出到文件,而不会因错误而得到空白文件?

我正在尝试运行一个命令,将其写入文件,然后将该文件用于其他用途。

我需要的要点是:

myAPICommand.exe parameters > myFile.txt
Run Code Online (Sandbox Code Playgroud)

问题是myAPICommand.exe失败了很多。我尝试修复一些问题并重新运行,但我遇到了“无法覆盖现有文件”的问题。我必须运行一个单独的rm命令来清理空白myFile.txt,然后重新运行myAPICommand.exe.

这不是最严重的问题,但很烦人。

当我的基本命令失败时,如何避免写入空白文件?

linux command-line error-handling output write

7
推荐指数
2
解决办法
3649
查看次数

为什么我无法使用 wall 命令发送消息?

我正在尝试使用 wall 或 write 发送消息。为了测试这一点,我打开了两个 gnome 终端窗口。然后在一个窗口中输入以下内容:

me@host>>wall
message to everyone


<ctrl> + d
Run Code Online (Sandbox Code Playgroud)

当我完成消息后,我使用(ctrl-d)发送了一个中断信号EOF 字符。终端没有发送消息,而是向我发出蜂鸣声,就好像我输入了无效的输入一样。我在 write 中得到了类似的行为。有人可以帮助我解决问题吗?

编辑:这是权限信息:

me@host>>ls -l $(type -p wall)
-rwxr-sr-x 1 root tty 27368 May 26 18:31 /usr/bin/wall
Run Code Online (Sandbox Code Playgroud)

command-line ubuntu write

6
推荐指数
1
解决办法
1万
查看次数

如何判断数据是写入磁盘还是缓存?

我正在学习Linux下的文件操作调用。和许多其他功能使用缓存来提高性能,我知道可以read()将数据从缓存传输到磁盘设备。write()fsync()

但是,是否有任何命令或系统调用可以确定数据是否被缓存或写入磁盘?

io cache disk write

5
推荐指数
1
解决办法
1092
查看次数

以原子方式写入文件而不更改 inode(保留硬链接)

X在 Unix 上安全、原子地写入文件的正常方法是:

  1. 将新文件内容写入临时文件Y
  2. rename(2) YX

在两个步骤中,我们似乎除了X“就地”更改之外什么也没做。

它可以防止竞争条件和意外数据丢失(X被破坏但Y不完整或被破坏)。

这样做的缺点(在这种情况下)是它不会写入X就地引用的 inode ;rename(2)makeX引用一个新的 inode 编号。

X链接计数> 1(显式硬链接)的文件时,现在它不像以前一样引用相同的inode,硬链接已损坏。

消除缺点的明显方法是就地写入文件,但这不是原子的,可能会失败,可能导致数据丢失等。

有没有办法像原子一样做到rename(2)但保留硬链接?

也许将Y(临时文件)的 inode 编号更改为与 相同X,并为其X命名?一个 inode 级别的“重命名”。

这将有效地写入XwithY的新内容引用的 inode ,但不会破坏其硬链接属性,并且会保留旧名称。

如果假设的 inode“重命名”是原子的,那么我认为这将是原子的并且可以防止数据丢失/竞争。

system-calls hard-link inode rename write

5
推荐指数
1
解决办法
640
查看次数

为什么rm在删除写保护文件时会发出警告?

我有一个常规文件,我将其权限更改为444. 我知道由于文件受写保护,我们无法修改或删除文件的内容,但是当我尝试使用 删除此文件时rm,它会生成一个警告,说明我是否要删除写保护的文件。我的疑问是这不是取决于文件是否可以删除的目录权限?为什么rm即使目录具有写入和执行权限也会生成警告。是否可以删除文件还取决于文件权限吗?还是完全依赖于目录权限?

permissions directory chmod rm write

3
推荐指数
1
解决办法
5312
查看次数

为什么终端要逐行输入?

如果我使用:

strace echo 'a
b
c' > file
Run Code Online (Sandbox Code Playgroud)

底线是:

write(1, "a\nb\nc\nd\n", 8)             = 8
Run Code Online (Sandbox Code Playgroud)

但在

strace echo 'a
b
c
d' > /dev/pts/0
Run Code Online (Sandbox Code Playgroud)

这些线路是:

write(1, "a\n", 2)                      = 2
write(1, "b\n", 2)                      = 2
write(1, "c\n", 2)                      = 2
write(1, "d\n", 2)                      = 2
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,为什么它是逐行写的,而在第一种情况下它是一起写的。可能是因为终端是字符设备,但我得到了字符设备的定义:

字符 (char) 设备是一种可以作为字节流(如文件)访问的设备。 char 设备和常规文件之间唯一相关的区别是您始终可以在常规文件中来回移动,而大多数字符设备只是数据通道,只能按顺序访问。

编辑:Shell 是 bash。

shell devices write

2
推荐指数
1
解决办法
126
查看次数

write/wall:如何防止不可打印的字符被转义

相比

dd if=/dev/urandom bs=512 count=4
Run Code Online (Sandbox Code Playgroud)

write lsr < <(dd if=/dev/urandom bs=512 count=4)
Run Code Online (Sandbox Code Playgroud)

我如何实现预期的行为?电流输出:

Message from qwe@hhgw11 on pts/386 at 17:37 ...
^[\305^\I\216\372\265\204\257\244+\277^X\334\303\273\261\200\253\323g\
...S\322EOF
Run Code Online (Sandbox Code Playgroud)

write

-3
推荐指数
1
解决办法
109
查看次数