第5章 TCP客户-服务器程序例子

网络编程的调试手段

netstat工具
-a 列出系统中所有套接口的状态

netstat -a | grep <target> : 只提取关注的信息

ps -Al 查看进程的状态和关系


Posix 信号处理

信号是发生某事件时对进程的通知,有时称为软中断。它一般是一步的,这就是说,进程不可能提前知道信号发生的时间。
信号可以:
a. 有一进程发往另一进程(或本身)。
b. 由内核发往某进程。
信号的处理办法(disposition),也称为与信号关联的行为 (action)。通过调用函数 sigaction 来设置一个信号的处理办法, 有三个选择:
1. 提供一个函数,在信号发生时随即调用。这个函数称为信号处理函数 signal handler,而此行为则称为捕获信号。信号 SIGKILL 和 SIGSTOP 不能捕获。
信号处理函数的原型:
void handler(int signo);
2. 设置信号的处理办法为 SIG_IGN 来忽略信号。信号 SIGKILL 和 SIGSTOP 不能忽略;
3. 设置信号的处理办法为 SIG_DFL 来为它设置缺省处理办法。一般来说,缺省处理办法是在接受到信号时终止进程。个别信号的缺省处理办法是忽略。

struct sigaction {
    __sighandler_t sa_handler;
    unsigned long sa_flags;
    __sigrestore_t sa_restorer;
    sigset_t sa_mask;
};

设置处理程序的信号掩码:
Posix 允许我们指定这样一组信号,他们在信号处理程序被调用是阻塞。任何阻塞的信号都不能递交 delevering 给进程。Posix 保证信号处理程序正在运行时被捕获的信号是阻塞的。

设置标志 SA_RESTART :
如果设置该标志,由此信号中断的系统调用将由内核自动重启。较早期的系统,如SunOS 4.x, 缺省就是自动重启被中断的系统调用,而它的互补标志则定义成 SA_INTERRUPT。

僵尸进程
设置僵尸 Zombie 状态的目的就是维护子进程的信息,以便父进程在稍后的某个时间取回。这些信息包括子进程的 ID, 终止状态以及子进程的资源利用信息(CPU时间,内存等等)。如果一个进程终止,且该进程有子进程处于僵尸状态,则所有僵尸子进程的父进程ID均置为 1(init进程)。init 进程将作为这些子进程的继父并负责清除他们。

慢系统调用 slow system call: 调用有可能永远无法返回,多数网络支持函数都属于这一类。
当一个进程阻塞于慢系统调用时捕获到一个信号,等到信号处理程序返回时,系统调用可能返回一个 EINTR 错误。

wait 和 waitpid 函数

#include <sys/wait.h>
pid_t wait(int *statloc);
pid_t waitpid(pid_t, int *statloc, int options);
返回: 成功 -> 进程ID,出错 -> -1。
statloc: 返回子进程的终止状态(一个整数)。
如果没有终止的子进程让进程来调用 wait,但有一个或多个正在执行的子进程,则 wait 阻塞直到第一个现有子进程终止。
函数 waitpid 对等待那个进程及是否阻塞给了我们更多的控制。参数 pid 指定想等待的进程ID,值 -1 表示等待第一个终止的进程(还有其他选项)。参数 options 指定附加选项,最常用的是 WNO_HANG,它通知内核在没有已终止子进程时不要阻塞。

跨越套接口传送二进制结构是很不明智的!
两个常用方法来解决数据格式问题:
a. 把所有的数值数据作为文本串来传递。[这也要以两个主机有相同的字符集为基础]
b. 显示定义所支持数据类型的二进制格式(位数,大端或小端),在客户与服务器之间以此格式传递数据。远程过程调用 RPC 软件包常用此技术。

转载于:https://www.cnblogs.com/learne/archive/2009/08/11/1543587.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值