[英]C Socket Programming: Trying to serve new client connections using fork()
[英]How to daemonize a process in C using fork() func. - socket programming
我已經搜索了很多,並且我知道也許我已經遇到了一些有用的答案,但卻無法理解它們......我的程序員並不多。:)
我希望實現一個守護進程 - 后台進程完全獨立於同時發生的事情 - 解析從服務器接收的數據(我正在編寫IRC客戶端)但是使用select以非阻塞方式進行()。
這是我的代碼片段。 但我無法在評論//其余的程序中獲得printf
我希望它足夠可以理解。
pID=fork();
if(pID < 0){
//failed to execute fork()
perror("Error while forking");
getchar();getchar();
exit(1);
}
if(pID > 0){
exit(0);
}
//child down here
umask(0);
//setting new session
sID = setpgid(0,0);
if(sID < 0){
perror("Error while setting new session");
getchar();getchar();
exit(1);
}
while(1){
sleep(1);
if((readReady = readReadiness(sockfd))==0)
continue;
else{
//here am going to recv() data from server
printf("I am child and parsing\n"); //testing if its in background -i would like it not to print to stdout (run in background)
}
}
//rest of the program down here
printf("Why isnt it printing to stdout ??\n");
我應該使用孫子嗎? (雙分叉?)或......?
提前致謝
我上面的評論既不回答也不暗示; 這是一個問題。
我不明白為什么你需要再次分叉 - 你有一個沒有控制終端的過程(感謝setpgid)你想要的。 您可以在while(1)循環中處理接收的數據。 看起來你已經准備好了 - “程序的其余部分”進入了while循環。
編輯
調用fork會創建正在運行的進程的子副本。 在子節點中調用setsid將斷開子節點與終端的連接,但不會影響父節點(無論如何都會退出)。 我建議你從以下事情開始:
static void
process_stuff(int sockfd)
{
while (1) {
/* receive data on socket and process */
}
}
void
run_daemon(int sockfd, int foreground)
{
if (!foreground) {
if (fork()) {
exit(EXIT_SUCCESS); /* parent */
}
/* child */
setsid();
}
process_stuff(sockfd);
}
擁有if (foreground)
子句的原因是它允許您在gdb
下的前台調試服務器時它不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.