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函式解釋如下:
dup
和dup2
都可用來複制一個現存的檔案描述符,使兩個檔案描述符指向同一個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
再複製。
下面這個例子演示了dup
和dup2
函式的用法,請結合後面的連環畫理解程式的執行過程。
#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()即可。 編寫守護程序的一般步驟步驟: