您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關PostgreSQL在Windows系統下的信號處理都是怎樣的,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
PostgreSQL在Windows下的信號處理,其實只能說是模擬或者代碼封裝,調用的時候看起來也是 pgsignal
函數,實現了代碼的跨平臺,但在實現上完全跟信號無關,畢竟Windows也沒有這個特性。
1、PostgreSQL的Windows代碼在函數 save_backend_variables
中:
#ifdef WIN32 param->PostmasterHandle = PostmasterHandle; if (!write_duplicated_handle(¶m->initial_signal_pipe, pgwin32_create_signal_listener(childPid), childProcess)) return false; #else
下邊分別講這里的兩個函數,用到的API可以自行查閱微軟文檔。
2、創建命名管道
函數 pgwin32_create_signal_listener
的作用是創建一個命名管道
snprintf(pipename, sizeof(pipename), "\\\\.\\pipe\\pgsignal_%u", (int) pid); pipe = CreateNamedPipe(pipename, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 16, 16, 1000, NULL);
3、復制管道句柄
函數 write_duplicated_handle
中:
if (!DuplicateHandle(GetCurrentProcess(), src, childProcess, &hChild, 0, TRUE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))
這個復制的句柄通過 param
傳遞給新創建的后端進程。
4、Windows下的信號函數
pqsigfunc pqsignal(int signum, pqsigfunc handler) { pqsigfunc prevfunc; if (signum >= PG_SIGNAL_COUNT || signum < 0) return SIG_ERR; prevfunc = pg_signal_array[signum]; pg_signal_array[signum] = handler; return prevfunc; }
這里有一個信號處理函數數組,pqsignal
的作用是記錄下這是處理哪個信號的函數。
5、Windows下的 kill
函數
#define kill(pid,sig) pgkill(pid,sig) extern int pgkill(int pid, int sig);
在 pgkill
里,使用上邊創建的命名管道
snprintf(pipename, sizeof(pipename), "\\\\.\\pipe\\pgsignal_%u", pid); if (CallNamedPipe(pipename, &sigData, 1, &sigRet, 1, &bytes, 1000))
將信號寫入管道,例如 SIGHUP。
6、信號處理線程
在啟動時,創建一個專門處理命名管道事件的線程:
/* Create thread for handling signals */ signal_thread_handle = CreateThread(NULL, 0, pg_signal_thread, NULL, 0, NULL);
7、后端進程的信號處理
函數 pg_signal_dispatch_thread
里(src/backend/port/win32/signal.c
):
/* Create thread for handling signals */ signal_thread_handle = CreateThread(NULL, 0, pg_signal_thread, NULL, 0, NULL); ... pg_queue_signal(sigNum);
關于PostgreSQL在Windows系統下的信號處理都是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。