卷一 第五章:TCP客户/服务器程序示例

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.数据格式

服务器和客户端的传输数据和存储格式需要考虑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值