linux网络编程值,如何擦屁股

1.在处理并发服务器的时候发现了一个问题,就说在使用创建子进程的方法的时候如果在客户端退出后,但是服务器端的子进程变成了僵死进程,这就尴尬了,讲道理是当进行四次挥手以后程序退出,但是为什么会编程僵死进程呢,就是当子进程退出以后,他会给父进程发送一个SIGCHLD的信号,父进程并没有捕捉他,没有处理,所以子进程就编程了僵死进程。
2,处理方法,就是在linux中,每一个信号都有与之相关联的处理方法,就是捕捉功能,在liunx系统中有两种信号不能进行捕捉捕捉的函数使用signal函数,捕捉的信号是SIGCHLD,表示当子进程退出后会发送这样一个信号给父进程。
第一,kill信号,第二是stop信号,但是呢 我们的目的就是说让子程序退出后父进程对他进行处理不要让子进程编程僵尸进程,在父进程上加一个wait函数起始就ok了。

signal(SIGCHLD,my_sig);

void my_sig(int signo)
{
    pid_t pid;
    int status;
    pid = wait(&status);
    return ;
}

针对于并发服务器:
暂时我知道的就是两种,一个使用fork开辟子进程,
一种是使用poll查看当前有多少个连接的客户端,然后将已经连接上的客户端的描述符放入数组中,判断数组中不同的描述符的属性,执行响应的程序。

总结:
每一个套接字都有两个缓冲区,一个是接收的一个是发送的。
对于TCP来说他的接收缓冲区是不可能溢出的们因为他会通告对端窗口大小,也就是说不会允许对端发送大于字节缓冲区大小的数据过来。这也就是流量控制。(那么TCP是如何进行流量控制的也就是说如何通告对端窗口大小的)
但是对于UDP来说他是没有流量控制的,他是通过判断如果对端发送的数据大于接收缓冲区的话那么就会将这一个数据包丢弃。

还有一个问题就是:对于TCP来说,如果他的接受缓冲区有4096个字节使用read函数指定读取4096个字节和对于udp来说如果他的接受缓冲区有两个2048个字节数据报,而使用recvfrom接收4096个字节的区别,就是tcp可以读取到4096个字节,因为TCP是数据流,他会读完缓冲区的数据,但是udp一次只能读取到2048个数据报,是以数据报为单位的,不管接收方请求读取多大,他都会返回一个数据报大小的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值