C 当我替换正在运行的PostgreSQL server使用的.so文件时,它会崩溃

C 当我替换正在运行的PostgreSQL server使用的.so文件时,它会崩溃,c,postgresql,unix,installation,mmap,C,Postgresql,Unix,Installation,Mmap,我正在CentOS 5.8上运行PostgreSQL 9.2.8 在构建自己的contrib模块时,我发现只需通过cp更改扩展名即可使服务器进程崩溃,但刷新扩展名即可。因此通过make&&make install更改文件可以正常工作 这看起来很严重,因为服务器进程崩溃导致群集意外重新启动 根据我自己的测试,这与pg_stat_语句和pg_缓冲区完全相同 为什么会这样?谢谢。有什么区别? makeinstall通常使用install命令删除文件,然后重新创建文件。(这并非天生正确,这只是大多数人的

我正在CentOS 5.8上运行PostgreSQL 9.2.8

在构建自己的contrib模块时,我发现只需通过
cp
更改
扩展名即可使服务器进程崩溃,但刷新
扩展名即可。因此通过
make&&make install
更改
文件可以正常工作

这看起来很严重,因为服务器进程崩溃导致群集意外重新启动

根据我自己的测试,这与
pg_stat_语句
pg_缓冲区
完全相同

为什么会这样?谢谢。

有什么区别?
makeinstall
通常使用
install
命令删除文件,然后重新创建文件。(这并非天生正确,这只是大多数人的
Makefile
s的编写方式)

相比之下,
cp
只是就地覆盖它

为什么这很重要? UNIX/Linux系统运行时将二进制文件映射到内存中。这意味着文件内容本质上是程序内存的直接部分。因此,当您在程序运行时覆盖可执行二进制文件的内容时,事情可能会以令人兴奋的方式发展

相反,如果删除(取消链接)该文件,它将保持映射为匿名文件。它仍然存在,直到最后一个句柄被关闭,它只是没有一个文件名了。然后使用相同的文件名创建新文件,但不会影响现在无法访问的未链接文件的内容。所以没有崩溃——只要您没有多个程序实例希望看到共享库的同一版本,至少是这样

如何做对? 如果您坚持要替换正在运行的可执行文件的二进制文件,则应使用
install
命令,或使用
rm/the/path&&cp/new/file/the/path
后跟任何必需的
chown
chmod

展示差异的演示 设置:

$ echo "whatevs" > blah
$ touch /tmp/blah
使用
安装

strace -e unlink,open,write install blah /tmp/blah
...
unlink("/tmp/blah")                     = 0
open("blah", O_RDONLY)                  = 3
open("/tmp/blah", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
write(4, "whatevs\n", 8)                = 8
...
vs
cp

$ strace -e unlink,open,write cp blah /tmp/blah
...
open("blah", O_RDONLY)                  = 3
open("/tmp/blah", O_WRONLY|O_TRUNC)     = 4
write(4, "whatevs\n", 8)                = 8
...
注意
如何安装
首先取消链接
s旧文件?这是至关重要的


另一个区别是,如果一个文件有多个硬链接,
install
不会更改指向同一基础文件的其他链接的内容
cp
will.

您是否查看了
makeinstall
的功能?对我来说,这是一个非常合乎逻辑的下一步。