激发这个问题的原因是我正在测试看门狗设备的功能,我在想是否有一个 shell 内置命令来打开设备而不执行任何操作/等到终止?
Echo/touch
似乎只是在执行操作后立即打开和关闭设备。Cat
似乎不起作用。
我正在使用 C 应用程序执行相同的操作,但想知道 shell 脚本是否对此有一些规定
答案1
在伯恩式的外壳中,
exec 3< "$device"
打开 shell 的文件描述符 3 上的设备。
这或多或少相当于 C 的:
fd = open(device, O_RDONLY);
if (fd < 0) handler_error(...);
if (fd != 3) { dup2(fd, 3); close(fd); }
(也在那个 fd 上ksh93
做了一个)。fcntl(3, F_SETFD, FD_CLOEXEC)
关闭它:exec 3<&-
在zsh
,ksh93
和 中bash
, 的等价物fd = open(device, O_RDONLY)
也可以写为:
exec {fd}< "$device"
其中文件描述符将是 9 以上的第一个空闲描述符并存储在$fd
.
关闭它:exec {fd}<&-
替换<
为>
for O_WRONLY|O_CREAT|O_TRUNC
、<>
forO_RDWR|O_CREAT
和>>
for O_WRONLY|O_CREAT|O_APPEND
。
zsh
还有一个sysopen
内置(在zsh/system
模块中)您可以在其中准确指定标志。
请注意,在 POSIX 兼容的 shell 中,exec
作为特别内置,如果文件无法打开,则在非交互时这是一个致命错误(退出脚本)。您可以使用该command
命令禁用它。
if command exec 3< "$device"; then
do-what-you-need-to-do
else
handle-the-error-yourself
fi
答案2
while sleep 3600; do :; done >/dev/your_watchdog
我(从工作和失败中)收集到echo
该touch
设备cat
应该以只写模式打开。