在Linux上写入执行进程的映像
如果进程B(通常的write()系统调用)将一些数据写入进程A的映像,而后者正在执行? 它会不会导致进程A执行的错误?
我是Linux的新手。 据我所知,Unix历史上并没有强制强制文件锁定(就像Windows一样)。 所以写作是很有可能的。
我在网上搜索没有结果。 当我问我这个Linux经验丰富的同事的这个问题时,他们都回答了这个过程,A的形象完全在内存中。
尽管如此,从我读过的内容来看,内核可以轻松地将一些页面从内存中交换回映像文件,比如说,当内存条件不足时。 所以,在磁盘上,一些页面可能会被另一个写入器进程损坏; 之后,可以将它们交换回RAM并执行。
您是否正在考虑将进程写入pid_t
1234的另一个进程的某个/proc/1234/mem
?
或者您是否正在考虑将流程写入另一个流程的ELF可执行文件?
这两个scenarii是非常罕见的和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会按需加载可执行文件,因此只有在需要时才会加载页面。
但是看到我对前一个问题的回答覆盖内存映射可执行文件时会发生什么?
链接地址: http://www.djcxy.com/p/56075.html上一篇: Writing to executing process' image on Linux
下一篇: How to emulate min