小编Bra*_*don的帖子

管道在 Linux 中的工作原理

我一直在阅读有关如何在 Linux 内核中实现管道的信息,并希望验证我的理解。如果我不正确,将选择具有正确解释的答案。

  • Linux 有一个名为 pipefs 的 VFS,它安装在内核中(不是在用户空间中)
  • pipefs 有一个超级块,安装在它自己的根 ( pipe:) 上,旁边是/
  • 与大多数文件系统不同,pipefs 不能直接查看
  • pipefs 的入口是通过pipe(2)系统调用
  • pipe(2)shell 用于与|操作员(或从任何其他进程手动)进行管道传输的系统调用在 pipefs 中创建一个新文件,该文件的行为与普通文件非常相似
  • 管道运算符左侧的文件已stdout重定向到在 pipefs 中创建的临时文件
  • 管道运算符右侧的文件已stdin设置为 pipefs 上的文件
  • pipefs 存储在内存中,通过一些内核魔法,不应该被分页

这是对管道(例如ls -la | less)如何运作的解释非常正确吗?

我不明白的一件事是像 bash 这样的东西如何设置一个进程stdinstdoutpipe(2). 我还没有找到任何关于它的信息。

kernel pipe

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

strace/ptrace 会导致程序崩溃吗?

所以最近,我和某人讨论了 strace,他们问如果你在创建一个网络套接字或类似的东西时 strace 一个正在运行的进程会发生什么。这会导致程序以意想不到的方式崩溃吗?

根据我对 ptrace(strace 使用的系统调用)的了解,如果您只是在调试线程,它不应该导致类似的事情。每次调用系统调用时,该进程都会停止,但它应该稍后恢复并且不会更明智。信号在未运行时排队,所以我假设 syscalls/sockets/listen 会发生类似的事情。

在 strace 上下文中使用的 ptrace 会导致任何奇怪的进程崩溃吗?

strace

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

使用重定向/管道时 bash 如何实际更改 stdin/stdout/stderr

不幸的是,我没有运气弄清楚这一点,因为我发现的一切都只是关于重定向的语法,或者关于重定向如何工作的浅薄信息。

我想知道的是bash的其实是如何改变stdin/ stdout/stderr当您使用管道或重定向。例如,如果您执行:

ls -la > diroutput.log
Run Code Online (Sandbox Code Playgroud)

它是如何改变stdoutlsdiroutput.log

我假设它是这样工作的:

  • Bash 运行fork(2)以创建自身的副本
  • 分叉的 bash 进程将它设置stdoutdiroutput.log使用类似的东西freopen(3)
  • 分叉的 bash 进程运行execve(2)或类似的 exec 函数来替换自身ls,现在使用stdoutbash 设置

但这只是我有根据的猜测。

bash fork

4
推荐指数
1
解决办法
2549
查看次数

wget 在下载完成后挂起,在 exit_group 上

我正在运行 CentOS 6.3 版(最终版)。我的服务器上的每个 VM 都会出现此问题。通过 SSH 连接时,wget 在下载某些 URL 后挂起。

我正在运行以下命令:

wget --no-http-keep-alive -O test http://downloads.sourceforge.net/project/nagiosplug/nagiosplug/1.4.16/nagios-plugins-1.4.16.tar.gz?r=http%3A%2F%2Fwww.nagios.org%2Fdownload%2Fplugins%2F
Run Code Online (Sandbox Code Playgroud)

如果我继续运行stracewget我会在最后得到以下输出:

clock_gettime(CLOCK_MONOTONIC, {2670737, 421643851}) = 0
write(3, "\316\206\257'\323\4\241\262\322\"\326I\236\37\327\365\27295\310\t\210\"\212$\350[\214\346\177$\320"..., 745) = 745
write(2, ".", 1.)                        = 1
write(2, " ", 1 )                        = 1
write(2, " ", 1 )                        = 1
write(2, " ", 1 )                        = 1
write(2, " ", 1 )                        = 1
write(2, " ", 1 )                        = 1
write(2, " ", 1 )                        = 1
write(2, …
Run Code Online (Sandbox Code Playgroud)

centos wget

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

如何存储大目录(一个或多个?)

我一直在研究 ext2 文件系统和 inode,但我不太了解一些事情。

一个inode有多大?tune2fs 的输出表明我的系统是 256,那是 256 字节吗?

大目录如何存储?据我了解,目录在文件系统上表示为一个 inode,其内容是表示目录内容的文件名和 inode 编号列表。内容是否存储在 inode 本身中,或者在这种情况下,它们是否以与文件数据相同的方式存储为“数据”?

ext2 inode

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

标签 统计

bash ×1

centos ×1

ext2 ×1

fork ×1

inode ×1

kernel ×1

pipe ×1

strace ×1

wget ×1