Linux下多程序避免殭屍程序的方法

2021-08-05 19:14:22 字數 1769 閱讀 2793

#include #include #include #include #include #include #include #include #include #include #include //wait(null) 只要有乙個子程序退出,那麼wait就會返回

//若多個子程序,只能等待乙個。

//while (waitpid(-1, null, wnohang) > 0)

//;//wnohang 不掛起,如果沒有子程序,會返回-1,從而可以跳出迴圈,訊號函式執行完畢

#define err_exit(m) \

do \

while(0)

ssize_t readn(int fd, void *buf, size_t count)

else if (nread == 0)

return count - nleft;

bufp += nread;

nleft -= nread;

}return count;

}ssize_t writen(int fd, const void *buf, size_t count)

else if (nwritten == 0)

continue;

bufp += nwritten;

nleft -= nwritten;

}return count;

}ssize_t recv_peek(int sockfd, void *buf, size_t len)

}ssize_t readline(int sockfd, void *buf, size_t maxline)

}if (nread > nleft)

exit(exit_failure);

nleft -= nread;

ret = readn(sockfd, bufp, nread);

if (ret != nread)

exit(exit_failure);

bufp += nread;

}return -1;

}void echo_srv(int conn)

fputs(recvbuf, stdout);

writen(conn, recvbuf, strlen(recvbuf));

}}//原因如上

void handle_sigchld(int sig)

}int main(void)

else

}return 0;

}

順便給出client的**,共同復用的函式在上面已經給出下面只貼上主要**:

void echo_cli(int sock)

; char recvbuf[1024] = ;

while (fgets(sendbuf, sizeof(sendbuf), stdin) != null)

fputs(recvbuf, stdout);

memset(sendbuf, 0, sizeof(sendbuf));

memset(recvbuf, 0, sizeof(recvbuf));

}close(sock);

}int main(void)

以上在client關閉時,server 也可以正常關閉

結語:建立鏈結很簡單,但是關閉鏈結需要小心,close()函式是引用計數型的,而且socket鏈結也是可以複製的,所以需要小心拷貝複製!!!

不足之處 請務必指出,感謝

避免殭屍程序

下面通過 為了觀察,完成同樣的功能,體會三種程序等待方式的區別。三種等待方式 1.wait waitpid 忽略sigchild訊號 忽略sigchild訊號只在linux下有效 2.wait只能進行阻塞等待,waitpid既可以用於阻塞等待,也可以用於非阻塞等待 waitpid 當waitpid的...

Linux下如何避免殭屍程序的產生

比如程序採用exit 退出的時候,作業系統會進行一些列的處理工作,包括關閉開啟的檔案描述符 占用的記憶體等等,但是,作業系統也會為該程序保留少量的資訊,比如程序id號等資訊,因而占用了系統的資源。在一種極端的情況下,檔殭屍程序過多的時候,占用了大量的程序id,系統將無法產生新的程序,相當於系統的資源...

什麼是殭屍程序和孤兒程序?怎麼避免殭屍程序

孤兒程序 父程序退出,子程序還在執行的這些子程序都是孤兒程序,孤兒程序將被 init 程序 進 程號為 1 所收養,並由 init 程序對它們完成狀態收集工作。殭屍程序 程序使用 fork 建立子程序,如果子程序退出,而父程序並沒有呼叫 wait 或 waitpid 獲 取子程序的狀態資訊,那麼子程...