SO_LINGER选项用于控制close系统调用在关闭TCP连接时的行为。在默认情况下,当说我们使用close系统调用关闭一个socket时,close立即返回,TCP模块负责把socket对应的TCP发送缓冲区中残留的数据发送给对方。
根据linger结构体中两个变量的不同值,会有三种不同的结果:
1、l_onoff==0 ,此时SO_LINGER选项不起作用,close用默认行为来关闭socket.
2、l_onoff != 0 && l_linger==0。此时close的行为取决于两个条件,一是被关闭的socket对应的TCP发送缓冲区中是否存在数据,二是该socket是阻塞还是非阻塞的。对于阻塞socket,close将等待一段l_linger的时间,直到TCP模块发送完所有残留数据并得到对方的确认,如果这段时间内TCP模块没有发送完残留数据并得到对方的确认,那么close系统调用将返回-1并设置errno为EWOULDBLOCK.如果socket是非阻塞的,close将立即返回,此时我们需要根据其返回值和errno来判断残留数据是否已经发送完毕。
二、 会话创建相关的API
一些有关联的进程组将形成一个会话,下面的函数用于创建一个会话:
#include <unistd.h>
pid_t setsid(void);
该函数不能有进程组的首领进程调用,否则将产生一个错误,对于非组首领的进程,调用该函数不仅创建新会话,而且如下额外的效果:
1、调用进程成为会话的首领,此时该进程是新会话的唯一成员
2、新建一个进程组,其PGID就是调用进程的PID,调用进程成为该组的首领
3、调用进程将甩开终端。
原文地址:http://blog.csdn.net/yusiguyuan/article/details/40480349