前景提要
linux socket服务到底要怎么写,才能正常回收进程?
0 [待解决问题] 设置了setsockopt,也搞了signal(SIGCHLD, handler);,主要想处理socket通讯超时的问题。
但是发现会循环输出 printf ("成功处理一个子进程的退出\n");
void handler(int sig)
{
while (waitpid(-1, NULL, WNOHANG) > 0)
{
printf ("成功处理一个子进程的退出\n");
}
}
int main()
{
int listen_socket = Creat_socket();
signal(SIGCHLD, handler); //处理子进程,防止僵尸进程的产生
while(1)
{
int client_socket = wait_client(listen_socket); //多进程服务器,可以创建子进程来处理,父进程负责监听。
int pid = fork();
if(pid == -1)
{
perror("fork");
break;
}
if(pid > 0)
{
close(client_socket);
continue;
}
if(pid == 0)
{
close(listen_socket);
struct timeval timeout;
timeout.tv_sec=60;
timeout.tv_usec=0;
if (-1 ==setsockopt(client_socket,SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,sizeof(timeout)))
{
}
if (-1 ==setsockopt(client_socket,SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout,sizeof(timeout)))
{
}
hanld_client(listen_socket, client_socket);
break;
}
}
close(listen_socket);
return 0;
} Dellienware | 初学一级 | 园豆: 39
提问于:2019-04-04 14:43 显示帮助
使用"Ctrl+Enter"可进行快捷提交,评论支持部分 Markdown 语法:[link](http://example.com) _italic_ **bold** `code`。
< > 分享
分享您的问题
所有回答(1) 0 main() 里不是有个 while(1){} 么,父进程不断地在创建子进程,子进程不断推出,自然一直在输出“成功处理一个子进程的退出”了。
你是把 fork() 的返回给父子进程的值得判断搞反了吧 一罪 | 园豆:245 (菜鸟二级) | 2019-04-04 17:00 那应该怎么写啊 支持( 0 ) 反对( 0 ) Dellienware | 园豆:39 (初学一级) | 2019-04-12 14:23 @Dellienware: man fork看说明。fork()返回值大于0是回到父进程,等于0是回到子进程,因此交换一下 if( pid > 0 ) 和 if( pid == 0) 的处理代码就可以了。 Return Value
On success, the PID of the child process is returned in the parent, and 0 is returned in the child. On failure, -1 is returned in the parent, no child process is created, and errno is set appropriately. 支持( 0 ) 反对( 0 ) 一罪 | 园豆:245 (菜鸟二级) | 2019-04-20 17:52 编辑文本 预览 上传图片
Ctrl+Enter键快速提交
清除回答草稿
您需要 登录 以后才能回答,未注册用户请先 注册 。