exit()函数用于终止调用进程。关闭所有子进程打开的描述符,向父进程发送SIGCHLD信号,并返回状态。
父进程可通过调用wait()或waitpid()函数获得子进程的终止信息。
{
if(listen(listenfd,BACKLOG)== -1){
perror("listen() error\n");
exit(1);
}
len=sizeof(client);
while(1)
{
if ((connfd =accept(listenfd,(struct sockaddr *)&client,&len))==-1) {
perror("accept() error\n");
exit(1);
}
if ((pid=fork())>0)
{
//父进程需要关闭已建立连接的套接字,然后继续等待接受其他连接
close(connfd);
continue;
}
else if (pid==0)
{
//子进程需要关闭父进程中的监听套接字,处理建立连接的套接字收发数据
close(listenfd);
process_cli(connfd, client);
exit(0);
}
else {
printf("fork()error\n");
exit(0);
}
}
close(listenfd);
}
void pthread_exit(void*status);
指针status:指向线程的退出状态。不能指向一个局部变量,因为线程终止时其所有的局部变量将被撤销。
还有其他两种方法可使线程终止:
(1)启动线程的函数pthread_create()的第3个参数返回。其返回值便是线程的终止状态;
(2)如果进程的main()函数返回,或者当前进程中,任一线程调用了exit()函数,将终止该进程中所有线程。
【实例】
{
if(listen(listenfd,BACKLOG)== -1){
perror("listen()error\n");
exit(1);
}
len=sizeof(client);
while(1)
{
//接受客户端发过来的连接请求(阻塞到有连接请求)
if ((connfd =accept(listenfd,(struct sockaddr *)&client,&len))==-1) {
perror("accept() error\n");
exit(1);
}
arg = (struct ARG *)malloc(sizeof(struct ARG));
arg->connfd =connfd;
memcpy((void*)&arg->client, &client, sizeof(client));
//创建线程来执行发送、接收的动作
if(pthread_create(&tid, NULL, function, (void*)arg)) {
perror("Pthread_create() error");
exit(1);
}
}
close(listenfd);
}