unp-TCP客户/服务器程序学习1

要点:

1.服务器子进程中止时,给父进程发送一个 SIGCHLD信号,该信号默认是被忽略,需要自己处理------信号处理

2.为了 可移植性,使用自己的 signal 函数。代码如下:

#include"unp.h"

Sigfunc*

signal(int signo,Sigfunc*func)

{

struct sigaction act,oact;

act.sa_handler=func;

sigemptyset(&act.sa_mask);

act.sa_flags=0;

if(signo==SIGALM)

{

#ifdef SA_INTERRUPT

       act.sa_flags |=SA_INTERRUPT;

#endif

}else{

#ifdef SA_RESTART

act.sa_flags|=SA_RESTART;

#endif

}

if(sigaction(signo,&act,&oact)<0)

return(SIG_ERR);

return(oact.sa_handler);

}


}

}


附上sigaction的说明:

定义函数 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

函数说明 sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum可以指定SIGKILL和SIGSTOP以外的所有信号。

如参数结构sigaction定义如下

struct sigaction {

void (*sa_handler)(int);

void (*sa_sigaction)(int, siginfo_t *, void *);

sigset_t sa_mask;

int sa_flags;

void (*sa_restorer)(void);

}

信号处理函数可以采用void (*sa_handler)(int)或void (*sa_sigaction)(int, siginfo_t *, void *)。到底采用哪个要看sa_flags中是否设置了SA_SIGINFO位,如果设置了就采用void (*sa_sigaction)(int, siginfo_t *, void *),此时可以向处理函数发送附加信息;默认情况下采用void (*sa_handler)(int),此时只能向处理函数发送信号的数值。

sa_handler此参数和signal()的参数handler相同,代表新的信号处理函数,其他意义请参考signal()。

sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号集搁置。

sa_restorer 此参数没有使用。

sa_flags 用来设置信号处理的其他相关操作,下列的数值可用。

sa_flags还可以设置其他标志:

SA_RESETHAND:当调用信号处理函数时,将信号的处理函数重置为缺省值SIG_DFL

SA_RESTART:如果信号中断了进程的某个系统调用,则系统自动启动该系统调用

SA_NODEFER :一般情况下, 当信号处理函数运行时,内核将阻塞该给定信号。但是如果设置了 SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号.

之后使用wait()/waitpid()处理以终止的子进程。

void sig_chld(int signo)

{

pid_t pid;

int stat;

while((pid=waitpid(-1,&stat,WNOHANG))>0)

printf("child %d terminated\n",pid);

return ;

}

3.SIGCHLD信号是在父进程阻塞在慢系统调用(accept)时由父进程捕获,内核就会使accept返回EINTR错误(被中断的系统调用),而不处理该错误,于是中止。因此需要自己处理。虽然有些系统提供SA_RESTART,但可移植性的方法更好。如下:

for(  ;   ;    )

{

          clilen=sizeof(cliaddr);

          if((connfd=accept(listenfd,(SA*)&cliaddr,&clilen))<0){

              if(errno==EINTR)

              continue;

  else

    err_sys("accept error");

}

注意:有一个函数不能重启:connect.必须调用select来等待连接完成。

你可能感兴趣的:(unp-TCP客户/服务器程序学习1)