在linux c/c++编程时,父进程fork出子进程后,子进程经常第一件事就是close掉所有的文件描述符;为何需要这样做,本文用一个例子进行简单说明。
考虑到一种情况,父进程创建了tcp服务端套接字,并且listen,此时fork出子进程,若子进程里面不close此监听套接字,则子进程里面是否能接收到客户端的连接。
因为一旦子进程里面也能够接收到客户端的连接,无疑会造成混乱。
答案是可以的,现在构造一个服务端程序,listen后,fork出子进程,然后父进程进入sleep,子进程调用accept,在accept成功后,打印对应的信息。
服务端代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#define PORT 8888 //侦听端口地址:8888
#define BACKLOG 20 //侦听队列长度:2
extern void process_conn_server(int s); //服务器对客户端的处理:读取数据并发送响应字符
int main(int argc,char *argv[])
{
int ss = 0; //ss = server socket = 服务器socket描述符
int cs = 0; //cs = client socket = 客户端socket描述符
struct sockaddr_in server_addr; //服务器地址结构
struct sockaddr_in client_addr; //客户端地址结构
int ret = 0; //返回值
pid_t pid;
//进程ID
char buffer[1024];
ssize_t size = 0;
/**
* Step 2 : 建立套接字
*/
ss = socket(AF_INET,SOCK_STREAM,0);