#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 獲 取子程序的狀態資訊,那麼子程...