Tim*_*Tim 53 linux process proc
https://www.centos.org/docs/5/html/5.2/Deployment_Guide/s3-proc-self.html 说
该
/proc/self/目录是指向当前正在运行的进程的链接。
总是有多个进程并发运行,那么哪个进程是“当前运行的进程”呢?
考虑到上下文切换,“当前正在运行的进程”是否与当前在 CPU 上运行的进程有关?
“当前正在运行的进程”是否与前台和后台进程无关?
Ste*_*itt 73
这与前台和后台进程无关;它只与当前运行的进程有关。当内核必须回答“/proc/self指向什么?”这个问题时,它只是选择当前调度的 pid,即当前运行的进程(在当前逻辑 CPU 上)。效果是/proc/self总是指向询问程序的pid;如果你跑
ls -l /proc/self
Run Code Online (Sandbox Code Playgroud)
您会看到ls的 pid,如果您编写使用/proc/self该代码的代码,则会看到它自己的 pid 等。
ilk*_*chu 41
访问符号链接的那个(在它上面调用 readlink(),或者在通过它的路径上调用 open())。当时它会在 CPU 上运行,但这无关紧要。一个多处理器系统可以同时在 CPU 上有多个进程。
前台和后台进程大多是一个 shell 构造,也没有唯一的前台进程,因为系统上的所有 shell 会话都会有一个。
sle*_*man 30
措辞本来可以更好,但是您尝试撰写的任何措辞来表达自我引用的想法都会令人困惑。在我看来,目录的名称更具描述性。
基本上,/proc/self/代表正在阅读的过程/proc/self/。因此,如果您尝试/proc/self/从 C 程序打开,则它代表该程序。如果您尝试从 shell 执行此操作,那么它就是 shell 等。
但是如果你有一个四核 CPU 能够同时运行 4 个进程,真正的,而不是多任务处理呢?
然后每个进程会看到不同/proc/self/的真实,而无法看到彼此的/proc/self/.
这是如何运作的?
嗯,/proc/self/是不是真的一个文件夹。它是一个设备驱动程序,如果您尝试访问它,它碰巧将自己暴露为一个文件夹。这是因为它实现了文件夹所需的 API。该/proc/self/目录是不是做这个的嘛。考虑从远程服务器安装共享文件夹或安装 USB 拇指驱动器或 Dropbox。它们都通过实现相同的 API 集来工作,这些 API 使它们的行为类似于文件夹。
当一个进程尝试访问/proc/self/设备驱动程序时,它会通过从该进程读取数据来动态生成其内容。所以里面的文件/proc/self/实际上并不存在。它有点像一面镜子,可以反射出试图查看它的过程。
它真的是设备驱动程序吗?你听起来好像把事情简单化了!
是的,确实如此。如果你想学究,它是一个内核模块。但是,如果您查看各种 Linux 开发人员频道上的 usenet 帖子,大多数内核开发人员会交替使用“设备驱动程序”和“内核模块”。我曾经为 Linux 编写设备驱动程序,呃……内核模块。如果您想在 中编写自己的界面/proc/,例如,您想要一个/proc/unix.stackexchange/从该网站返回帖子的文件系统,您可以在 O'Reilly 出版的著名的“Linux 设备驱动程序”一书中阅读有关如何执行此操作的信息。它甚至可以作为在线软拷贝使用。
小智 12
它是碰巧正在访问的进程/proc/self或其中的文件/文件夹。
试试cat /proc/self/cmdline。你会惊讶地发现,,cat /proc/self/cmdline(实际上,在t和之间会有一个空字符而不是空格/),因为它将是访问这个伪文件的 cat 进程。
当您执行 an 时ls -l /proc/self,您将看到 ls 进程本身的 pid。或者怎么样ls -l /proc/self/exe?它将指向 ls 可执行文件。
或者试试这个,改变一下:
$ cp /proc/self/cmdline /tmp/cmd
$ hexdump -C /tmp/cmd
00000000 63 70 00 2f 70 72 6f 63 2f 73 65 6c 66 2f 63 6d |cp./proc/self/cm|
00000010 64 6c 69 6e 65 00 2f 74 6d 70 2f 63 6d 64 00 |dline./tmp/cmd.|
0000001f
Run Code Online (Sandbox Code Playgroud)
甚至
$ hexdump -C /proc/self/cmdline
00000000 68 65 78 64 75 6d 70 00 2d 43 00 2f 70 72 6f 63 |hexdump.-C./proc|
00000010 2f 73 65 6c 66 2f 63 6d 64 6c 69 6e 65 00 |/self/cmdline.|
0000001e
Run Code Online (Sandbox Code Playgroud)
正如我所说,它是碰巧正在访问的进程/proc/self或其中的文件/文件夹。