日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux c 服务程序,Linux C 后台服务程序单进程控制

發布時間:2023/12/15 linux 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux c 服务程序,Linux C 后台服务程序单进程控制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

通常后臺服務器程序都必須有且只有一個進程,那么如何單進程呢?

本例子是通過flock函數對/var/run/myserver.pid記錄pid文件的進行加鎖

若加鎖不正常,說明后臺服務進程已經在運行了,這時則直接報錯退出

若加鎖成功,說明后臺服務進程沒有在運行,這時可以正常啟用進程

后臺服務程序單進程控制

詳細不多說,直接看代碼

#include

#include

#include

#include

#include

#include

#define PID_BUF_LEN (20)

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

//服務進程單實例運行

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

int server_is_running()

{

int fd = open(RUN_PID_FILE, O_WRONLY|O_CREAT);

if(fd < 0)

{

printf("open run pid err(%d)! %s

", errno, RUN_PID_FILE);

return -1;

}

// 加鎖

// LOCK_SH 建立共享鎖定。多個進程可同時對同一個文件作共享鎖定。

// LOCK_EX 建立互斥鎖定。一個文件同時只有一個互斥鎖定。

if(flock(fd, LOCK_EX|LOCK_NB) == -1)

{

//加不上鎖,則是服務正在運行,已上鎖了

printf("server is runing now! errno=%d

", errno);

close(fd);

return 1;

}

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

// 文件句柄不要關,也不要解鎖

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

printf("myserver is not running! begin to run..... pid=%ld

", (long)getpid());

char pid_buf[PID_BUF_LEN] = {0};

snprintf(pid_buf, sizeof(pid_buf)-1, "%ld

", (long)getpid());

// 把進程pid寫入到/var/run/myserver.pid文件

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

return 0;

}

int main(void)

{

//進程單實例運行檢測

if(0 != server_is_running())

{

printf("myserver process is running!!!!! Current process will exit !

");

return -1;

}

while(1)

{

printf("myserver doing ...

");

sleep(2);

}

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 doing ...

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

[root@lincoding singleprocess]# 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 服务程序,Linux C 后台服务程序单进程控制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。