linux Perl中“open函数”和“touch命令”的区别?

nhhxz33t  于 2022-11-02  发布在  Linux
关注(0)|答案(5)|浏览(235)

下面两种情况下的文件创建有什么区别。

open(DATA,">newfile.txt");       #1.using open function
  close(DATA);

  `touch newfile.txt`;             #2.using touch command

哪一个更好更快?注:当open函数和touch命令都用在Perl脚本中时,则考虑其用于创建空文件。

9rnv2umw

9rnv2umw1#

第 二 种 情况 的 明显 区别 在于 , 你 要 去 系统 。 启动 一 个 shell 来 运行 命令 , 或者 通过 execvp 系统 调用 来 运行 命令 ( 取决 于 参数 , 见 下文 ) 。 有 很多 事情 要 做 , 而且 很多 事情 也 可能 出错 。
更 重要 的 是 , 还有 更多 的 事情 要 做 。 如果 文件 已经 存在 怎么 办 ? 首先 , open 会 截断 它 , 而 touch 只 会 更新 时间 戳 。 但是 你 想要 一 个 * 新 * 文件 , 所以 无论 如何 你 都 需要 先 检查 一下 。 如果 失败 了 怎么 办 ? 你 需要 检查 一下 。 因此 这 应该 是 一 个 小 例程 。
那么 就 用 Perl 来 写 吧 。 委托 这么 简单 的 工作 没有 任何 好处 , 只有 陷阱 。
注意 : 使用 三 个 参数 open

open my $fh, '>', $file  or ...

中 的 每 一 个
这样 你 就 有 了 一 个 更 好 的 * 词法 ( 间接 ) 文件 句柄 * 来 使用 。
感谢 hek2mgi 的 评论 和 ikegami 的 澄清 , qx 可以 根据 参数 绕过 shell ( 什么 看 起来 没有 文档 记录 ? ) † , 很 像 system
根据 hek2mgi 注解 , 可以 通过 strace -f script.pl 对此 进行 检查 , 其中 , 在 脚本 中 使用 qx(touch "NEW") 时 , 我们 可以 找到 以下 行

[pid 24332] execve("/bin/sh", ["sh", "-c", "touch \"NEWFILE\""], [/* ...

格式
qx(touch NEW) 的 输出 中 没有 /bin/sh ( 没有 引号 , 没有 shell ) 。
需要 注意 的 是 , qx 确实 接受 一 个 数组 ( 文档 中 未 提及 ) , 这 显然 是 插值 的 。

[pid 30773] execve("/bin/sh", ["sh", "-c", "ls -l > tt.out"], [/* ...

格式
然后 , 如 上文 所 述 , 如果 需要 , 则 运行 shell ( 本 示例 ) , 否则 不 运行 shell ( qw(ls -l ) 。
† 但 在 这 一 点 上 ( 2022 年 10 月 ) , 我 确实 在 qx 文档 中 找到 了 它 , 响亮 而 清晰 , 而且 是 预先 的

ehxuflar

ehxuflar2#

  • 哪一个更好更快?

这个问题毫无意义。这两个代码段并不等价,所以您应该问“哪个代码段可以完成我想要的任务?”如果文件存在,open将删除该文件,而touch将保持该文件不变。
至于在使用系统调用和使用外部命令之间哪一个更好,答案是显而易见的,如果你不从这个问题中忽略大多数代码的话!
直接使用系统调用:

utime(undef, undef, $qfn)
    or die("Can't touch \"$qfn\": $!\n");

通过外部命令使用系统调用:

use String::ShellQuote qw( shell_quote );

my $cmd = shell_quote("touch", "--", $qfn);
my $output = `$cmd 2>&1`;
die("Can't touch \"$qfn\": Killed by signal ".($? & 0x7F)."\n" if $? & 0x7F;
die("Can't touch \"$qfn\": Exited with error ".($? >> 8).": $output" if $? >> 8;

正如你所看到的,用shellout来实现要复杂得多,也容易出错。当然,启动整个程序来进行系统调用比只进行系统调用要慢得多。

zbdgwd5y

zbdgwd5y3#

这是两个截然不同的命令。
touch用于修改文件的访问和修改时间。默认情况下,它会将访问和修改时间设置为当前时间,如果文件不存在-它会将其创建为空文件。
open用于打开文件进行阅读或写入。根据给定的模式,如果文件不存在,open命令也可以创建文件。
使用touch意味着调用一个单独的进程(shell),因此考虑到这一限制,首选open API命令。

u0sqgete

u0sqgete4#

open:用于读/写。
touch:用于更新/修改。
但是,touch通过实际克隆自身(perl克隆)来打开shell,以运行另一个进程。

taor4pac

taor4pac5#

打开函数用于读/写文件。该函数使用文件描述符,然后写入指定的文件。而触摸函数创建一个新文件。

相关问题