1、netstat –a
监听套接字状态
2、ps:查看进程状态和关系
3、信号处理
SIGCHLD内核在任何一个进程终止时发送给它的父进程的一个信号
信号处理函数
void (*signal(int signo, void(*func)(int))) (int)
信号可以设置成SIG_IGN来忽略它,设置成SIG_DFL默认处置
调用sigaction
struct sigaction act, oact;
act.sa_handler = func;//指向信号处理函数
sigemptyset(&act.sa_mask);//这个信号设置成空集,表示不阻塞任何信号,posix允许指定的信号,在函数调用期间,任何被阻塞的信号都不能传递给进程,就被阻塞
act.sa_flags = 0;
4、处理僵死进程(子进程僵死前会向父进程传递SIGCHLD信号)
定义信号处理函数
绑定信号和处理函数
Signal(SIGCHLD, sig_chld);
void sig_chld(int signo){
pid_t pid;
int stat;
pid = wait(&stat);
printf("child %d terminated\n", pid);
return;
}
5、处理被中断的系统调用
阻塞与某个慢系统(accept函数等)的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。
for ( ; ; )
{
if ((connfd = accept(listenfd, (SA *)&cliaddr, &clilen)) < 0)
{
if (errno == EINTR)
{
Continue;
}
}
else
{
Err_sys(“accept error”);
}
}
6、wait和waitpid函数
进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
定义:
#include <sys/types.h> /* 提供类型pid_t的定义 */
#include <sys/wait.h>
pid_t wait(int *status)
如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。
pid_t waitpid(pid_t pid,int *status,int options)
pid:从参数的名字pid和类型pid_t中就可以看出,这里需要的是一个进程ID。但当pid取不同的值时,在这里有不同的意义。
pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。
pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。
options:Linux中只支持WNOHANG和WUNTRACED两个选项,WNOHANG参数调用waitpid,即使没有子进程退出,它也会立即返回。
7、服务器进程终止
服务器进程终止,客户端没有识别到,阻塞在某一程序上。(6.4)节会用到select和poll函数。
8、SIGPIPE信号
当一个进程向某个已收到RST的套接字执行写操作时,内核向该进程发送一个SIGPIPE信号,该信号的默认行为是终止进程。写操作返回EPIPE错误。
9、服务器主机崩溃后重启
服务器崩溃后,客户端给服务器发送消息,服务器连接后消息丢失发送RST给客户端,客户端阻塞于readline,返回ECONNRESET。
如果客户端对检测服务器主机是否崩溃很重要,即使客户不主动发送也要检测出来就要用(SO_KEEPALIVE套接字或心搏函数)
10.数据格式
服务器和客户端的传输数据和存储格式需要考虑