gpt4 book ai didi

perl - readline 卡在手动 pipe() 上

转载 作者:行者123 更新时间:2023-12-05 01:22:15 26 4
gpt4 key购买 nike

我正在尝试消除 open 的魔术叉变体:

# magic-fork.pl
if (open my $fh, '-|') { # fork self, make new fd for reading, attach child STDOUT to it
STDOUT->say('parent getpid: ', $$);
STDOUT->say('parent STDOUT->fileno: ', STDOUT->fileno);
STDOUT->say('parent $fh->fileno: ', $fh->fileno);
while (my $line = $fh->getline) {
STDOUT->print('parent readline from child: ', $line);
}
} else {
STDOUT->say('child getpid: ', $$);
STDOUT->say('child STDOUT->fileno: ', STDOUT->fileno);
}

它运行并完成。

# plain-fork.pl
pipe my $r, my $w;
if (fork) {
STDOUT->say('parent getpid: ', $$);
STDOUT->say('parent STDOUT->fileno: ', STDOUT->fileno);
STDOUT->say('parent $r->fileno: ', $r->fileno);
STDOUT->say('parent $w->fileno: ', $w->fileno);
while (my $line = $r->getline) {
STDOUT->print('parent readline from child: ', $line);
}
} else {
$w->say('child getpid: ', $$);
$w->say('child $r->fileno: ', $r->fileno);
$w->say('child $w->fileno: ', $w->fileno);
$w->say('child STDOUT->fileno: ', STDOUT->fileno);
}

这个程序在循环中意外挂起。

我试了没用:

  • 调用 $w->autoflush(1)
  • 显式关闭句柄
  • 明确退出
  • POSIX::dup2 $w 到 STDOUT
  • 检查 strace -ff 以查看我是否错过了关键的系统调用

有什么问题?

最佳答案

你在 forking 之前 pipe(像往常一样用于这种 IPC),所以两个进程都有读取和写入文件描述符的打开副本,所以读取父级中的循环只会阻止等待更多输入,这些输入永远不会来自仍然打开的写入端。

子进程需要close $r;,父进程需要close $w;在它们各自 block 的开始处(或者在你打印出这些句柄的文件描述符)。

关于perl - readline 卡在手动 pipe() 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53372637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com