我一直在阅读有关如何在 Linux 内核中实现管道的信息,并希望验证我的理解。如果我不正确,将选择具有正确解释的答案。
pipe:) 上,旁边是/pipe(2)系统调用pipe(2)shell 用于与|操作员(或从任何其他进程手动)进行管道传输的系统调用在 pipefs 中创建一个新文件,该文件的行为与普通文件非常相似stdout重定向到在 pipefs 中创建的临时文件stdin设置为 pipefs 上的文件这是对管道(例如ls -la | less)如何运作的解释非常正确吗?
我不明白的一件事是像 bash 这样的东西如何设置一个进程stdin或stdout由pipe(2). 我还没有找到任何关于它的信息。
所以最近,我和某人讨论了 strace,他们问如果你在创建一个网络套接字或类似的东西时 strace 一个正在运行的进程会发生什么。这会导致程序以意想不到的方式崩溃吗?
根据我对 ptrace(strace 使用的系统调用)的了解,如果您只是在调试线程,它不应该导致类似的事情。每次调用系统调用时,该进程都会停止,但它应该稍后恢复并且不会更明智。信号在未运行时排队,所以我假设 syscalls/sockets/listen 会发生类似的事情。
在 strace 上下文中使用的 ptrace 会导致任何奇怪的进程崩溃吗?
不幸的是,我没有运气弄清楚这一点,因为我发现的一切都只是关于重定向的语法,或者关于重定向如何工作的浅薄信息。
我想知道的是bash的其实是如何改变stdin/ stdout/stderr当您使用管道或重定向。例如,如果您执行:
ls -la > diroutput.log
Run Code Online (Sandbox Code Playgroud)
它是如何改变stdout的ls到diroutput.log?
我假设它是这样工作的:
fork(2)以创建自身的副本stdout为diroutput.log使用类似的东西freopen(3)execve(2)或类似的 exec 函数来替换自身ls,现在使用stdoutbash 设置但这只是我有根据的猜测。
我正在运行 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)
如果我继续运行strace,wget我会在最后得到以下输出:
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) 我一直在研究 ext2 文件系统和 inode,但我不太了解一些事情。
一个inode有多大?tune2fs 的输出表明我的系统是 256,那是 256 字节吗?
大目录如何存储?据我了解,目录在文件系统上表示为一个 inode,其内容是表示目录内容的文件名和 inode 编号列表。内容是否存储在 inode 本身中,或者在这种情况下,它们是否以与文件数据相同的方式存储为“数据”?