1. 程式人生 > >Redis 程序設定成守護程序

Redis 程序設定成守護程序

Redis程式碼中初始化過程中把程序變成守護程序後臺程式的程式碼

if (server.daemonize) daemonize();
void daemonize(void) {
    int fd;
    if (fork() != 0) exit(0); /* parent exits */
    setsid(); /* create a new session */


    /* Every output goes to /dev/null. If Redis is daemonized but
     * the 'logfile' is set to 'stdout' in the configuration file
     * it will not log at all. */
    if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {
        dup2(fd, STDIN_FILENO);//redirected the STDIN_FILENO to /dev/null

        dup2(fd, STDOUT_FILENO);//redirected the STDOUT_FILENO to /dev/null
        dup2(fd, STDERR_FILENO);//redirected the STDERR_FILENO to /dev/null
        if (fd > STDERR_FILENO) close(fd);
    }
}
其中用到的dup2函式解釋如下:

dupdup2都可用來複制一個現存的檔案描述符,使兩個檔案描述符指向同一個file結構體。如果兩個檔案描述符指向同一個file結構體,File Status Flag和讀寫位置只儲存一份在file

結構體中,並且file結構體的引用計數是2。如果兩次open同一檔案得到兩個檔案描述符,則每個描述符對應一個不同的file結構體,可以有不同的File Status Flag和讀寫位置。請注意區分這兩種情況。

#include <unistd.h>

int dup(int oldfd);
int dup2(int oldfd, int newfd);

如果呼叫成功,這兩個函式都返回新分配或指定的檔案描述符,如果出錯則返回-1。dup返回的新檔案描述符一定該程序未使用的最小檔案描述符,這一點和open類似。dup2可以用newfd引數指定新描述符的數值。如果newfd當前已經開啟,則先將其關閉再做dup2

操作,如果oldfd等於newfd,則dup2直接返回newfd而不用先關閉newfd再複製。

下面這個例子演示了dupdup2函式的用法,請結合後面的連環畫理解程式的執行過程。


#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> int main(void)
{
int fd, save_fd;
char msg[] = "This is a test\n";

fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
if(fd<0) {
perror("open");
exit(1);
}
save_fd = dup(STDOUT_FILENO);
dup2(fd, STDOUT_FILENO);
close(fd);
write(STDOUT_FILENO, msg, strlen(msg));
dup2(save_fd, STDOUT_FILENO);
write(STDOUT_FILENO, msg, strlen(msg));
close(save_fd);
return 0;
}

重點解釋兩個地方:

  • 第3幅圖,要執行dup2(fd, 1);,檔案描述符1原本指向tty,現在要指向新的檔案somefile,就把原來的關閉了,但是tty這個檔案原本有兩個引用計數,還有檔案描述符save_fd也指向它,所以只是將引用計數減1,並不真的關閉檔案。

  • 第5幅圖,要執行dup2(save_fd, 1);,檔案描述符1原本指向somefile,現在要指向新的檔案tty,就把原來的關閉了,somefile原本只有一個引用計數,所以這次減到0,是真的關閉了。

相關推薦

Redis 程序設定守護程序

Redis程式碼中初始化過程中把程序變成守護程序後臺程式的程式碼 if (server.daemonize) daemonize(); void daemonize(void) {     int fd;     if (fork() != 0) exit(0); /

php使用redis作為訊息佇列--守護程序模式執行

  出隊指令碼 編寫指令碼,通過crontab定時執行指令碼,從list的右邊取出錯誤處理。 這種方式的優點是不會出現資料的丟失,只有定時指令碼處理完相關資訊之後,才從佇列中取出;缺點也是顯而易見的,響應不夠及時,因為是定時訪問redis的list隊形,所以不能實時的處理佇列中

windows下面安裝redis 並且設定自動後臺啟動

github下載地址:https://github.com/MicrosoftArchive/redis/releases&nbs

centos 7.x設定守護程序的檔案數量限制

在Bash中有個ulimit命令,提供了對Shell及該Shell啟動的程序的可用資源控制。主要包括開啟檔案描述符數量、使用者的最大程序數量、coredump檔案的大小等。 在CentOS 5/6等版本中,資源限制的配置可以在/etc/security/limits.conf設定,針對root/user等各

設定zookeeper為systemctl守護程序

==目的== 想把zookeeper、hadoop、hbase、storm等大資料元件 設定為開機啟動,並且程序掛掉之後,可以自動重啟,以減少運維壓力。   ==service檔案== 路徑:/usr/lib/systemd/system 檔名:train-zookeeper.servi

7、CentOS7 安裝Docker之擴充套件(設定守護程序對外開放)

設定守護程序對外開放   雖然預設下你的Docker daemon只允許在本機訪問,但有時候也有充足理由讓其他人訪問。你可能有什麼問題想讓其他人遠端除錯,或者你可能想允許DevOps工作流來啟動主機上的一個程序。     問題 你想對其

Laravel Redis佇列的使用 配置Horizon和Supervisor守護程序

環境:lz用的是Homestead5.4.0   Laravel5.5 (一)佇列的配置檔案路徑:config/queue.php,Laravel為我們提供了多種驅動的配置:sync, database,beanstalkd,sqs,redis。 sync是預設的驅動,選

Redis使用守護程序啟動sentinel並指定其日誌目錄

正常redis-server可以通過配置檔案來指定守護程序啟動以及指定日誌路徑,但sentinel就不一樣了。正常啟動redis的sentinel時,程序會直接在前臺跑,一退出sentinel程序就關了: [root@redis_01 redis]# redis-serve

Redis守護程序方式啟動

我本機redis的安裝路徑/usr/local/redis 1、 開啟/usr/local/redis/redis.conf檔案,將daemonize設定的值設定為yes 2、複製redis的配置檔案 #cp /usr/local/redis/redis.conf/

將Java程序打包可執行EXE文件的步驟

圖標 tps 程序 .net 命名 r文件 pan java .html 需要的工具myeclipse 、jar2exe(附上下載地址,直接解壓就可以用鏈接: https://pan.baidu.com/s/1qYPRgXu 密碼: wbva) 1、將Java項目導出成.j

將課程作業01的設計思想、程序流程圖、源程序代碼和結果截圖整理一篇博文

package static 技術分享 整理 public out 計算 mage 數字 1.程序設計思想 先讓用戶輸入要計算的數字的個數,然後讓用戶輸入這幾個數,將字符型轉化為整數,然後求和,最後輸出所求得的和即可。 2.程序流程圖 3.源程序代碼 pack

Android Studio無法啟動 Gradle ,無法啟動守護程序

bsp fin tar gradle ace option star brush intro Error:Unable to start the daemon process. This problem might be caused by incorrect confi

教你如何用C#制作文字轉換聲音程序

using edi 選擇算法 匹配 接收 隨機 initial 數字 轉換成 教你如何用C#制作文字轉換成聲音程序 在System.Speech命名空間下,SpeechSynthesizer類可以把文字讀出來,一起來玩下~~ 首先在Windows窗體項目中引入System

pyinstaller 打包python文件.exe程序

process 密碼 alt script tex exe 控制臺 網址 想要 使用pycharm寫好的代碼,每次都要使用pycharm來執行比較麻煩,打包成.exe程序後可以直接運行,還可以發到別的電腦上執行,比較方便。 1.打開cmd命令提示符窗口,cd到pip.ex

將MySQL集打包安裝程序,實現一鍵安裝

pro 技術 admin tex 打包成 原理 mys col start 前言   實現原理:       集成一個已經配置好的MySQL文件夾,然後通過.bat文件配置MySQL的服務。實現免安裝MySQL數據庫   缺陷: 由於是集成一個已經安裝好的MySQL文

程序BAT爭鋒新戰場

一個 cal font 安卓 微信平臺 大會 支付 mage 戰略 說起小程序,相信大家首先聯想到的都是微信小程序,這無可厚非,因為微信是社交類運用,用戶群體廣大,尤其是小程序小遊戲“跳一跳”更是成為了很多人認識小程序的第一媒介。如今甚至於出現了“微信互聯網”這個詞。 然而

linux守護程序小結

建立守護程序步驟: 建立子程序父程序退出, 讓這個子程序變成孤兒程序, 防止產生殭屍程序 在子程序中建立新會話 setsid函式用於建立一個新的會話,並使得當前程序成為新會話組的組長 setsid函式能夠使程序完全獨立出來,從 而脫離所有其他程序的控制。 改

python程序守護程序

標籤(空格分隔): 守護程序 主程序建立子程序,然後將該程序設定成守護自己的程序,守護程序就好比崇禎皇帝身邊的老太監,崇禎皇帝已死老太監就跟著殉葬了; 關於守護程序需要強調兩點: 其一:守護程序會在主程序程式碼執行結束後就終止 其二:守護程序內無法再開啟子程序,否則丟擲異常:Assert

PHP-Websockets 上傳檔案2 優化支援php socket客戶端和websocket連線websocket伺服器 以守護程序方式執行編碼

WebsocketServer: users.php <?php class WebSocketUser { public $socket; public $id; public $headers = array(); public $handsh

php 編寫linux守護程序

問題:將一個php程式以linux守護程序(在後臺執行)的方式執行? 解決方法:(見程式碼) // index.php檔案 <?php /*實現守護程序化,當你的PHP程式需要轉為後臺執行時, 只需要呼叫一次封裝好的函式init()即可。 編寫守護程序的一般步驟步驟: