linux - 在 Linux 上写入执行进程的镜像

标签 linux image process

如果进程 B 在进程 A 执行时写入(使用通常的 write() 系统调用)一些数据到进程 A 的镜像中怎么办?它不会导致 A 正在执行的进程损坏吗?

我是 Linux 新手。据我了解,Unix 历来不强加强制文件锁(就像 Windows 那样)。所以写作是很有可能的。

我在网上搜索过没有结果。当我问我有 Linux 经验的同事这个​​问题时,他们都回答说进程 A 的镜像完全在内存中。

尽管如此,根据我的阅读,内核可以轻松地将一些页面从内存交换回图像文件,例如,当强调低内存条件时。因此,在磁盘上时,某些页面可能会被另一个写入进程损坏;之后,它们可以交换回 RAM 并执行。

最佳答案

您是否正在考虑将一个进程写入另一个 pid_t 1234 进程的某些 /proc/1234/mem

或者您是否正在考虑将一个进程写入另一个进程的 ELF 可执行文件?

这两种情况都非常罕见并且是特定于 Linux 的(其他 Posix 没有这些),所以我不知道在那种情况下会发生什么。但至少许可机制应该保护一些。

另请参阅 ETXTBSY 错误。

在实践中(如 strace -f/usr/bin/gcc hello.c -o hello 所示),编译器和链接器会在 open 之前删除可执行文件 -将其写入可执行文件,因此大多数编译永远不会写入旧的可执行文件:

870   stat("hello", {st_mode=S_IFREG|0755, st_size=6096, ...}) = 0
870   unlink("hello")                   = 0
870   open("hello", O_RDWR|O_CREAT|O_TRUNC|O_CLOEXEC, 0777) = 17
870   fstat(17, {st_mode=S_IFREG|0755, st_size=0, ...}) = 0

所以要写入一个可执行文件,你必须努力尝试。当然,当您这样做时,可能会发生顽皮的崩溃。

关于linux - 在 Linux 上写入执行进程的镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8097157/

相关文章:

linux - 如何在代码中获取与WiFi的准确距离?

linux - 使用 ForkManager 在 Linux 上运行 Perl 脚本

linux - CloudCompare 无法启动,错误为 : "QXcbConnection: Could not connect to display :0"

PHP 调用系统 vs Bash 脚本安全

c# - Metro APP - BitmapImage 到 Byte[] 或从 Web 下载图像并将其转换为 Byte[] 数组

Javascript 从表中获取图像 src

Java:子进程完成后使用相同的子进程变量是否安全?

图像作为 Actionscript 3 中的变量

c# - 给出凭据时 process.start() 抛出 win32Exception

python - 如何在函数内初始化并行独立进程?