2014-09-23 5 views
0

Я работаю над проектом класса, связанным с Postgres. Я хочу знать, что такое «основная» функция, используемая на сервере Postgres? Я ищу что-то соответствующее main() в простой программе C. Я хочу знать путь к файлу и имя функции. Я использую Postgres 9.3.5, однако я предполагаю, что «основная» функция не изменится между различными версиями.Функция «Core» в Postgres

Пожалуйста, дайте мне знать, если вы смущены моим вопросом.

Спасибо.

Редактировать: re-posted this on the pgsql-hackers mailing list.

ответ

6

Я думаю, вы, вероятно, говорите о контуре событий сервера.

Это зависит от типа бэкэнд.

Для почтмейстера это PostmasterMain в src/backend/postmaster/postmaster.c (postmaster startup), то ServerLoop в том же файле.

Для обычных рабочих бэкендов это PostgresMain в src/backend/tcop/postgres.c.

Другие бэкенды (например, авторам фона, автовакуумной пусковой установке и т. Д.) Имеют свои собственные основные петли.

На самом деле вы должны начать с developer information on the PostgreSQL site, особенно в разделе разработчика документации PostgreSQL, в которой обсуждаются внутренние функции PostgreSQL, а также ряд презентаций и статей, доступных для внутренних компонентов PostgreSQL.


Кроме того, получить хороший текстовый редактор с поддержкой ctags/cscope и ознакомятся с помощью отладчика, как gdb. Это упростит навигацию по источникам и прохождение кода. Вы могли бы вы ответили на это самостоятельно, например, путем:

  • Начиная бэкенд и получить его идентификатор процесса

    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, [email protected]=0xc3d0a0 <PqRecvBuffer>, [email protected]=8192, flags=-1, [email protected]=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>, [email protected]=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 ([email protected]=3, [email protected]=0x1d8a2d0) at postmaster.c:1223 
    #12 0x00000000004649fb in main (argc=3, argv=0x1d8a2d0) at main.c:227 
    
+0

Большое спасибо! – Lemon

+0

@ZackLi Предлагаю ознакомиться с http://www.postgresql.org/docs/current/static/internals.html и https://wiki.postgresql.org/wiki/Developer_FAQ. –