int i;
act.sa_handler=sigchld_handler; act.sa_flags=0;
sigemptyset(&act.sa_mask);
if(sigaction(SIGCHLD,&act,NULL)<0){
cout<<\ exit(1); }
for(i=0;i<5;i++){
if(fork()==0){ cout<<\ exit(0); } }
for(;;){}
return 0;
}
void sigchld_handler(int sig) { pid_t pid; int stat; for(;(pid=waitpid(-1,&stat,WNOHANG))>0;) {
cout<<\
} }
本程序通过循环过程生成了五个子进程,子进程将打印出他们自己的进程号,然后以status=0退出。由于本程序设置了信号SIGCHLD的处理,在处理函数sigchld_handler中,父进程接收到子进程发来的SIGCHLD信号时将打印出子进程的进程号以及退出状态。
6
六、 使用UDP套接字编程(13分)
客户机发送20个整数给服务器,服务器在其中找到这些整数的最大值,返回给客户机。 不考UDP 七、 编写一个服务器程序,使其能够实现TCP并发服务,并且打印出每个
连接成功的客户端的IP地址及其端口号(10分) #include ...
#define SERVPORT 3333 /* 服务器监听端口号 */ #define BACKLOG 10 /* 最大同时连接请求数 */
int main(void) {
int sin_size;
int sockfd, new_fd;
struct sockaddr_in server_addr; struct sockaddr_in client_addr;
//建立套接字
sockfd=socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) {
perror(\ exit(1); }
//填充地址
bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVPORT);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//绑定
if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) {
perror(\!\exit(1);
7
}
//监听
if (listen(sockfd, BACKLOG) == -1)
{
perror(\!\ exit(1); }
while(1) {
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct *)&client_addr, &sin_size)) == -1) {
perror(\ continue; }
printf(\addr:%s inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
if (!fork()) {/* 子进程代码段 */
/* do something */ /* ............ */ /* do something */
close(new_fd); exit(0); }
close(new_fd); }
return 0;
}
8
sockaddr %d\\n\