在 Linux 内核源代码中,磁盘 inode 结构中的块号是 32 位的。为什么?当然 Linux 可以支持超过 2^32 个块...
extremeaxe5's questions
我有以下shell交互:
[OP@localhost linux]$ tty
/dev/pts/7
[OP@localhost linux]$ stty tostop
[OP@localhost linux]$
在另一个终端中,我输入:
[OP@localhost linux]$ echo hello > /dev/pts/7
回到原来的,我看到:
[OP@localhost linux]$ tty
/dev/pts/7
[OP@localhost linux]$ stty tostop
[OP@localhost linux]$ hello
为什么是这样?不应该停止回显过程吗?
ps(1)
,使用该-f
选项,将输出方括号中没有相关命令行的进程,如下所示:
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug28 ? 00:07:42 /sbin/init
root 2 0 0 Aug28 ? 00:00:01 [kthreadd]
root 3 2 0 Aug28 ? 00:00:00 [rcu_gp]
root 4 2 0 Aug28 ? 00:00:00 [rcu_par_gp]
root 6 2 0 Aug28 ? 00:00:00 [kworker/0:0H-kblockd]
root 8 2 0 Aug28 ? 00:00:00 [mm_percpu_wq]
root 9 2 0 Aug28 ? 00:02:14 [ksoftirqd/0]
root 10 2 0 Aug28 ? 00:05:33 [rcu_preempt]
root 11 2 0 Aug28 ? 00:01:36 [rcuc/0]
root 12 2 0 Aug28 ? 00:00:00 [rcub/0]
root 13 2 0 Aug28 ? 00:00:07 [migration/0]
root 14 2 0 Aug28 ? 00:00:00 [idle_inject/0]
root 16 2 0 Aug28 ? 00:00:00 [cpuhp/0]
root 17 2 0 Aug28 ? 00:00:00 [cpuhp/1]
root 18 2 0 Aug28 ? 00:00:00 [idle_inject/1]
root 19 2 0 Aug28 ? 00:00:05 [migration/1]
root 20 2 0 Aug28 ? 00:00:55 [rcuc/1]
这些进程是否像其他进程一样被调度?
出于教育目的,我正在查看连接到终端的正在运行的 bash 进程的 strace 输出。
我的 bash 进程的 PID 为 2883。
我打字
[OP@localhost ~]$ strace -e trace=openat,read,write,fork,vfork,clone,execve -p 2883 2> bash.strace
进入一个终端。然后我进入我的 bash 进程,并进行以下交互:
[OP@localhost ~]$ ls
看着输出,我看到了
strace: Process 2883 attached
read(0, "l", 1) = 1
write(2, "l", 1) = 1
read(0, "s", 1) = 1
write(2, "s", 1) = 1
read(0, "\r", 1) = 1
write(2, "\n", 1) = 1
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fec6b1d8e50) = 3917
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3917, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
write(1, "\33]0;OP@localhost:~\7", 23) = 23
write(2, "[OP@localhost ~]$ ", 22) = 22
...
我对最后两行感到困惑。看来 bash 正在尝试编写两个 shell 提示?这里发生了什么?
在我的脚本副本中conda.sh
,我看到以下几行:
if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
SYSP=$(\dirname "${CONDA_EXE}")
else
SYSP=$(\dirname "${CONDA_EXE}")
SYSP=$(\dirname "${SYSP}")
fi
d
我很好奇为什么in前面有一个反斜杠dirname
。我不认为这是必要的。这种反斜杠的使用也出现在源文件的其他地方。我是否有这样做的理由?
例如,如果我这样做
[OP@localhost executable]$ cat garbage
lalala
trololol
[OP@localhost executable]$ chmod +x garbage
[OP@localhost executable]$ ./garbage
./garbage: line 1: lalala: command not found
./garbage: line 2: trololol: command not found
Bash 似乎试图将这个“可执行文件”解释为脚本。但是,有两种情况显然不会发生这种情况:当文件以 a#!
和 ELF 文件开头时。还有吗?在某处有这方面的综合文档吗?
FHS-3.0 将其描述为:
可共享的只读数据。这意味着它
/usr
应该可以在各种符合 FHS 的主机之间共享,并且不能被写入。
我对这意味着什么感到有些困惑。这是否意味着二进制文件或其中的任何其他文件应该可以复制粘贴到另一台机器上,并且它们可以正常运行?
在The Linux Programming Interface一书中,它说
内核对取消引用的数量施加了限制,以处理符号链接循环链的可能性。
我在哪里可以找到这个限制?
[fakename]$ nice yes a>/dev/null &
[1] 26475
[fakename]$ ps -p 26475 -o nice,pid
NI PID
10 26475
[fakename]$ nice { yes a>/dev/null; } &
-bash: syntax error near unexpected token `}'
有没有办法建立nice
一个命令组?
我知道一个:正常执行命令组,通过附加一个&符号将其置于后台,并renice
在命令组上使用。但是,有没有办法用 完成同样的事情nice
?
另外,为什么它会给我这个错误?是不是因为nice
不是 shell 关键字,因此必须遵循标准的 bash 参数解析规则?
例如,
[fakename]$ type echo
echo is a shell builtin
但是man echo
给了我 GNU coreutils 版本的echo
. 判断我正在查看的手册页是否正确的最简单方法是什么,即如果我直接调用它,我会得到实用程序的那个?