一,wait和waitpid函数
#include<sys/wait.h>
pid_t wait(int* statloc);
pid_t waitpid(pid_t pid,int statloc,int options);
这两个函数用来等待子进程结束. 参数statloc返回进程的终止状态,返回值为终止的子进程id
waitpid是wait的功能加强版,增加了一些有用的功能,因此也更为常用:
Again: int newfd = accept(fd,NULL,NULL); if(newfd<0 && errno==EINTR) goto Again; ......
void sig_chld(int signum) { pid_t pid; while( (pid=waitpid(-1,NULL,WNOHANG))>0 ) printf("process %d close\n",pid); }
signal(SIGCHLD,SIG_IGN);
void sig_chld(int signo) { pid_t pid; while((pid=waitpid(-1,NULL,WNOHANG))>0) { printf("child %d terminated\n",pid); } return ; } int main() { int ret; int listenfd = socket(AF_INET,SOCK_STREAM,0); sockaddr_in addr; addr.sin_family=AF_INET; addr.sin_port=htons(8003); addr.sin_addr.s_addr=htonl(INADDR_ANY); printf("read ret =0,close socket\n"); printf("read from newfd failed! ret=%d,%s\n",ret,strerror(errno)); ret = bind(listenfd,(sockaddr*)&addr,sizeof(sockaddr_in)); ret = listen(listenfd,5); setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, NULL, sizeof(int)); int newfd; sockaddr_in client_addr; socklen_t client_addr_len; char* cli_ip; int cli_port; char recv_buf[100]; char send_buf[100]; signal(SIGCHLD,sig_chld); while ( (newfd = accept(listenfd,(sockaddr*)&client_addr,&client_addr_len)) >0 ) { pid=fork(); if(pid==0) { close(listenfd); while(1) { ret = read(newfd,recv_buf,sizeof(recv_buf)); if(ret<0) { printf("read from newfd failed! ret=%d,%s\n",ret,strerror(errno)); break; }else if(ret == 0) { close(newfd); break; }else{ recv_buf[ret]='\0'; printf("recv %d bytes:[%s]\n",ret,recv_buf); strcpy(send_buf,"world"); ret = write(newfd,send_buf,strlen(send_buf)); printf("send %d bytes,[%s]\n",ret,send_buf); } } close(newfd); } close(newfd); } return 0; }
void sig_chld(int signum) { pid_t pid; while( (pid=waitpid(-1,NULL,WNOHANG))>0 ) printf("process %d close\n",pid); }
void sig_chld(int signum) { pid_t pid; while( (pid=waitpid(-1,NULL,WNOHANG))>0 ) printf("process %d close\n",pid); }