除了“CPU 的 MMU 发送信号”和“内核将其定向到违规程序并终止它”之外,我似乎找不到任何关于此的信息。
我认为它可能将信号发送到外壳,外壳通过终止违规进程和打印来处理它"Segmentation fault"。所以我通过编写一个我称之为crsh(废话 shell)的极简 shell 来测试这个假设。除了获取用户输入并将其提供给system()方法之外,此外壳不执行任何操作。
#include <stdio.h>
#include <stdlib.h>
int main(){
char cmdbuf[1000];
while (1){
printf("Crap Shell> ");
fgets(cmdbuf, 1000, stdin);
system(cmdbuf);
}
}
Run Code Online (Sandbox Code Playgroud)
所以我在一个裸终端中bash运行了这个 shell(没有在下面运行)。然后我继续运行一个产生段错误的程序。如果我的假设是正确的,这将 a) 崩溃crsh,关闭 xterm,b) 不打印"Segmentation fault",或 c) 两者兼而有之。
braden@system ~/code/crsh/ $ xterm -e ./crsh
Crap Shell> ./segfault
Segmentation fault
Crap Shell> [still running]
Run Code Online (Sandbox Code Playgroud)
回到第一个,我猜。我刚刚证明了不是外壳执行此操作,而是下面的系统。“分段错误”是如何打印出来的?“谁”在做?内核?还有什么?信号及其所有副作用如何从硬件传播到程序的最终终止?
我想在 Debian 系统上学习 C#。
我必须安装什么?
是否有类似交互式提示之类的东西,我可以在其中尝试运行代码片段?
我必须学习 C# 并且我有一台双启动计算机,但不想为了学习 C# 而关闭 Linux 并启动 Windows。
我按照迈克尔的回复 来查看我的 Ubuntu 可以识别执行哪些可执行格式
$ ls -l /proc/sys/fs/binfmt_misc/
total 0
-rw-r--r-- 1 root root 0 Apr 19 16:11 cli
-rw-r--r-- 1 root root 0 Apr 19 16:11 jar
-rw-r--r-- 1 root root 0 Apr 19 16:11 python2.7
-rw-r--r-- 1 root root 0 Apr 19 16:11 python3.5
--w------- 1 root root 0 Apr 19 16:11 register
-rw-r--r-- 1 root root 0 Apr 19 16:11 status
Run Code Online (Sandbox Code Playgroud)
我从来没有故意改变那里的任何东西,这些文件是默认创建的,或者是在我安装其他一些程序时创建的。
$ cat /proc/sys/fs/binfmt_misc/cli
enabled
interpreter /usr/lib/binfmt-support/run-detectors
flags:
offset 0
magic 4d5a
Run Code Online (Sandbox Code Playgroud)
这是一种什么样的可执行格式?我在 google 上搜索了“magic …
我写了一个简单的shell脚本如下:
#!/bin/bash
sleep 90
Run Code Online (Sandbox Code Playgroud)
运行此 shell 后,我pstree在单独的 shell 中运行以查看进程树结构。
这是我看到的
-gnome-terminal-+-bash---sleepy.sh---sleep
Run Code Online (Sandbox Code Playgroud)
我期待这会像
-gnome-terminal-+-bash---bash---sleep
Run Code Online (Sandbox Code Playgroud)
为什么 shell 脚本被 pstree 表示为一个进程?该ps命令正确显示正在执行的命令为
10150 8771 0 08:13 pts/1 00:00:00 /bin/bash ./sleepy.sh
Run Code Online (Sandbox Code Playgroud)
这里的过程是 bash,而 sleepy.sh 是它的参数(这对我来说很有意义)。在我看来,一个进程必须是一个可执行链接格式的二进制文件 (ELF)。Bash 是一个 ELF 可执行文件,但 shell 脚本不是,因此我认为pstree不应该这样显示它?
例如,如果我这样做
[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
Run Code Online (Sandbox Code Playgroud)
Bash 似乎试图将这个“可执行文件”解释为脚本。但是,有两种情况显然不会发生这种情况:文件以#!, 和 ELF 文件开头。还有吗?某处是否有关于此的全面文档?
那里的情况有点奇怪。我为 ARM 平台(32 位)编译了 BusyBox 1.32.1 的静态可执行文件,奇怪的是它在两个平台上都没有问题。自己看:
root@smallbuntu /m/n/b/i/n/rootfs# readelf -h bin/busybox-initrd
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x1f419
Start of program headers: 52 (bytes into file)
Start of section headers: 1482800 (bytes into file)
Flags: 0x5000002, Version5 …Run Code Online (Sandbox Code Playgroud) $ echo $PATH
/home/t/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ which PDFXCview.exe
/home/t/bin//PDFXCview.exe
$ ls /home/t/bin/PDFXCview.exe -l
lrwxrwxrwx 1 t t 97 Mar 18 09:20 /home/t/bin/PDFXCview.exe -> ../program_files/document/formats/pdf/TrackerSoftware/pdfxcview/pdfxchange_portable/PDFXCview.exe
Run Code Online (Sandbox Code Playgroud)
现在,
$ wine /home/t/bin/PDFXCview.exe &
[1] 23220
Run Code Online (Sandbox Code Playgroud)
但即使PDFXCview.exe可以在 中搜索$PATH,
$ wine PDFXCview.exe
wine: cannot find L"C:\\windows\\system32\\PDFXCview.exe"
Run Code Online (Sandbox Code Playgroud)
失败是因为它PDFXCview.exe没有作为命令名称出现在 中wine PDFXCview.exe,所以没有在 中搜索到吗$PATH?
有什么办法可以PDFXCview.exe 在wine PDFXCview.exe搜索中进行吗$PATH?
谢谢。