Linux C 後台服務程式單程序控制的實現

2022-10-06 19:39:11 字數 2162 閱讀 7778

介紹

通常後台伺服器程式都必須有且只有乙個程序,那麼如何單程序呢?

本例子是通過flock函式對/var/run/myserver.pid記錄pid檔案的進行加鎖

後台服務程式單程序控制

詳細不多說,直接看**

#include

#include hmhupb.h>

#include

#include

#include &www.cppcns.comlt;errno.h>

#include

#define pid_buf_len (20)

#define run_pid_file "/var/run/myserver.pid"

//服務程序單例項執行

//返回值: 1--正在執行,0--未執行,-1--出錯

int server_is_running()

www.cppcns.com

// 加鎖

// lock_sh 建立共享鎖定。多個程序可同時對同乙個檔案作共享鎖定。

// lock_ex 建立互斥鎖定。乙個檔案同時只有乙個互斥鎖定。

if(flock(fd, lock_ex|lock_nb) == -1)

// 加鎖成功,證明服務沒有執行

// 檔案控制代碼不要關,也不要解鎖

// 程序退出,自動就解鎖了

printf("myserver is not running! begin to run..... pid=%ld\n", (long)getpid());

char pid_buf[pid_buf_len] = ;

snprintf(pid_buf, sizeof(pid_buf)-1, "%ld\n", (long)getpid());

// 把程序pid寫入到/var/run/myserver.pid檔案

write(fd, pid_buf, strlen(pid_buf));

return 0;

}int main(void)

while(1)

return 0;

}執行結果

執行程式,可知程序pid是6965

[root@lincoding singleprocess]# ./myserver

server is not running! begin to run..... pid=6965

myserver doing ...

myserver doing ...

myserver doing ...

myserver doing ...

myserver doing ...

myserver doing ...

myserver doing ...

myserver do程式設計客棧ing ...

/var/run/myserver.pid 也記錄此程序的pid號,ps auxf | grep myserver可知mysever程序一直執行著

[root@lincoding singleproce程式設計客棧ss]# cat /var/run/myserver.pid

6965

[root@lincoding singleprocess]#

[root@lincoding singleprocess]# ps auxf | grep myserver

root 6965 0.0 0.0 3924 460 pts/0 s+ 00:32 0:00 | \_ ./myserver

root 9976 0.0 0.0 103256 856 pts/1 s+ 00:35 0:00 \_ grep myserver

[root@lincoding singleprocess]#

此時,再執行myserver程式,這時會報錯退出,因為檢測到myserver程式已經在執行中,不可以起另外乙個程序,從而達到了後台服務程式單程序控制

[root@lincoding singleprocess]# ./myserver

server is runing now! errno=11

myserver process is running!!!!! current process will exit !

本文標題: linux c 後台服務程式單程序控制的實現

本文位址:

後台服務小點

很多東西本來就存在,只是自己不懂,記錄在此,以便日後複習唄。今天碰到乙個問題就是專案中的靜態頁面是分開的,比如當面部落格頁面,它的頭是單獨的乙個html檔案,而下來的內容又是另外乙個,從專案本身以及在布置到伺服器上都沒有發現拼裝過程,於是好奇之,這是為啥呢,原來nginx早已具有這樣的功能,就是ss...

Linux 後台服務

方法一 fork方式 1.fork乙個子程序,父程序退出,子程序成為孤兒程序,被init程序接管 2.呼叫setsid建立新的程序會話 3.將當前工作目錄切換到根目錄 4.將標準輸入,輸出,出錯重定向到 dev null linux後台程序,fork方式 include include includ...

Mac 後台服務

mac 的後台服務通過launchctl工具實現 也可以使用linux下的crontab 但官方建議使用launchctl。使用launchctl非常簡單,根據需要編寫plist指令碼即可。plist指令碼存放路徑為 library launchdaemons或 library launchagen...