如果进程 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/