我正在开发一个与Postgres相关的课程项目。我想知道"核心" Postgres服务器使用的功能?我正在寻找一个简单的C程序中与main()对应的东西。我想知道文件路径和函数名称。我正在使用Postgres 9.3.5,但我假设"核心"函数将在不同的修订版本之间保持不变。
如果您对我的问题感到困惑,请告诉我。
感谢。
答案 0 :(得分:6)
我认为您可能正在谈论服务器事件循环。
取决于后端类型。
对于邮寄管理员,它是PostmasterMain
(邮件管理员启动)中的src/backend/postmaster/postmaster.c
,然后ServerLoop
位于同一文件中。
对于PostgresMain
中的常规工作人员后端src/backend/tcop/postgres.c
。
其他后端(如后台编写器,autovacuum启动器等)都有自己的主循环。
你应该从developer information on the PostgreSQL site开始,特别是PostgreSQL文档中讨论PostgreSQL内部的开发人员部分,以及PostgreSQL内部的一系列演示文章和文章。
此外,获得一个支持ctags
/ cscope
支持的优秀文本编辑器,并熟悉gdb
之类的调试器。它将使源代码导航并更轻松地逐步执行代码方式。你可以自己回答这个问题,例如:
启动后端并获取其进程ID
regress=> select pg_backend_pid();
pg_backend_pid
----------------
2292
(1 row)
附加gdb
sudo -u postgres gdb -p 2292
获得回溯
(gdb) bt
#0 0x0000003bc68f5c3d in __libc_recv (fd=10, buf=buf@entry=0xc3d0a0 <PqRecvBuffer>, n=n@entry=8192, flags=-1, flags@entry=0) at ../sysdeps/unix/sysv/linux/x86_64/recv.c:29
#1 0x00000000005f95f5 in recv (__flags=0, __n=8192, __buf=0xc3d0a0 <PqRecvBuffer>, __fd=<optimized out>) at /usr/include/bits/socket2.h:44
#2 secure_read (port=0x1db02c0, ptr=0xc3d0a0 <PqRecvBuffer>, len=8192) at be-secure.c:317
#3 0x0000000000602b53 in pq_recvbuf () at pqcomm.c:854
#4 0x00000000006037d5 in pq_getbyte () at pqcomm.c:895
#5 0x00000000006e19a0 in SocketBackend (inBuf=0x7fff2f397b10) at postgres.c:335
#6 ReadCommand (inBuf=0x7fff2f397b10) at postgres.c:483
#7 PostgresMain (argc=<optimized out>, argv=argv@entry=0x1d8b2b8, dbname=0x1d8b120 "regress", username=<optimized out>) at postgres.c:3975
#8 0x0000000000463c51 in BackendRun (port=0x1db02c0) at postmaster.c:4117
#9 BackendStartup (port=0x1db02c0) at postmaster.c:3791
#10 ServerLoop () at postmaster.c:1570
#11 0x00000000006780ee in PostmasterMain (argc=argc@entry=3, argv=argv@entry=0x1d8a2d0) at postmaster.c:1223
#12 0x00000000004649fb in main (argc=3, argv=0x1d8a2d0) at main.c:227