AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 409107
Accepted
Harv
Harv
Asked: 2017-12-06 21:51:34 +0800 CST2017-12-06 21:51:34 +0800 CST 2017-12-06 21:51:34 +0800 CST

“弹出”如何让进程关闭文件句柄?

  • 772

在我的 Mac 上,当我“弹出”网络安装的共享时,我的 Mac 向我显示以下消息,并尝试让进程关闭打开的文件句柄并干净地卸载共享。我的问题是,它究竟是如何实现的?我想它会枚举使用我的共享路径打开的文件句柄,然后向拥有这些文件句柄的进程发送某种信号?只是一个猜测,请告诉我,我对此很好奇。 弹出对话框 我考虑过在 Apple stack exchange 上问这个问题,但我猜这实际上是一个更普遍适用的 UNIX 问题。如果我错了,macOS 有一种特殊的/新的方式来做这个,这个问题需要关闭并在那里重新打开,请告诉我。

编辑:添加截图。

osx process
  • 2 2 个回答
  • 296 Views

2 个回答

  • Voted
  1. Giacomo Catenazzi
    2017-12-07T08:58:00+08:002017-12-07T08:58:00+08:00

    它没有。它只是卸载文件系统,所以当程序试图再次访问文件系统时,它会出错(希望它能顺利解决问题)。

    与您物理分离外部磁盘(或 USB 笔)的情况没有太大区别。文件系统不再可用,但程序会在第一次使用后看到它。

    • 0
  2. Best Answer
    thrig
    2017-12-07T09:02:43+08:002017-12-07T09:02:43+08:00

    我不知道,但有一个随机的 USB 记忆棒和一个程序

    $ df | grep Vol
    /dev/disk1s2  12228  20  12208  1%  512  0  100%   /Volumes/Firmware
    $ perl -E 'say $$; chdir "/Volumes/Firmware" or die "nope $!"; sleep 9999'
    66433
    

    我们确实可以停止弹出,但在此之前我们需要对进程进行一些调试,此处由在其他终端运行的 DTrace 提供

    $ sudo dtruss -p 66433
    ...
    

    然后通过英文所谓的强制弹出按钮,点击几下,延迟和警告,测试程序仍在运行,USB 记忆棒已卸载,并且dtruss没有显示任何内容:

    ...
    ^C
    $ lsof -p 66433 | grep cwd
    perl5.26 66433 jhqdoe  cwd        cwd|rtd info error: No such file or directory
    $ 
    

    因此,至少对于一个标准的 unix 程序来说,除了挂载点被从它下面移除之外什么都没有发生。接下来我们可以测试向挂载点写入一些东西,同样是使用标准的 unix 程序

    $ cat writeslow
    #!/usr/bin/env perl
    use 5.14.0;
    use warnings;
    
    open( my $fh, ">", "/Volumes/Firmware/mlatu" ) or die "nope $!";
    while (1) {
        syswrite( $fh, "mlatu\n" ) or warn "hmm $!";
        sleep 3;
    }
    $ perl writeslow
    

    在其他地方我们确认猫出现了(如果你使用一些更高级别的写函数,缓冲可能是个问题)

    $ cat /Volumes/Firmware/mlatu
    mlatu
    mlatu
    $ 
    

    我们再次强制弹出,程序确实注意到了这一点(但继续运行,因为它是这样写的):

    $ perl writeslow
    hmm Input/output error at writeslow line 7.
    hmm Input/output error at writeslow line 7.
    

    因此 Mac OS X 10.11(因为这个硬件太旧而无法运行 macOS)如问题中所述“试图让进程关闭打开的文件句柄”没有任何作用,并且没有证据表明“某种信号 [已发送]拥有这些文件句柄的进程”发生;相反,该进程继续运行,如果它进行任何类型的错误检查,那么它可能会失败,具体取决于它的编写方式。

    至少对于具有标准 unixcwd并使用标准 I/O 调用的标准 unix 程序;也许 Apple 框架程序有些不同?让我们再次重新安装 USB 记忆棒并使用...打开mlatu文件Hex Fiend.app

    $ open -a Hex\ Fiend /Volumes/Firmware/mlatu
    $ lsof | grep mlatu
    Hex\x20Fi 66642 jhqdoe  8r  REG  1,5  216  7 /Volumes/Firmware/mlatu
    $ 
    

    TextEdit(或者如果你没有安装,则使用或其他东西Hex Fiend)并再次执行强制弹出舞蹈......

    $ screencapture -w error.png
    $ 
    

    十六进制恶魔使用分区错误

    现在我们收到了与标准 unix 程序不同的消息,并且没有强制卸载的选项。

    • 0

相关问题

  • 确定自上次以来目录内容是否已更改的最快方法

  • 如何使用 `at` 安排脚本在 macOS 上执行?

  • csplit 无法识别提供的正则表达式

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve