最近看webbench和Tinyhttpd源码的一点学习:
在fork()或create()一个新的进程时,关闭socket连接总是用close()而不是shutdown(),百度了一下区别:
首先介绍一下close()和shutdown():
函数:int shutdown(int s, int how);
函数说明:shutdown()用来终止参数s 所指定的socket 连线. 参数s 是连线中的socket 处理代码, 参数how有下列几种情况:
how=0 终止读取操作.
how=1 终止传送操作
how=2 终止读取及传送操作
返回值:成功则返回0, 失败返回-1, 错误原因存于errno.
函数:int close(int s);
函数说明:close()用来终止参数s 所指定的socket 连线.
返回值:成功则返回0, 失败返回-1, 错误原因存于errno.
区别:
1.可以看到很明显的就是参数导致的区别:进程中close关闭一个socket,将终止进程对这个socket的任何的操作,但是使用shutdown可以选择的关闭关闭的方式,包括SHUT_RD(读),SHUT_WR(x写),SHUT_RDWR(读写) 三种方式。
2.在多个进程共享socket时候,一个进程调用close只会使计数减一(引用计数?),直到所有的进程都调用的了colse,这个socket才会被释放,
如果一个进程调用shutdown,那个这个所有的进程将不能再使用读、写或者读写。
总结区别2 ,就是close不会影响其他进程对socket的使用,shutdown会影响其他进程对socket的使用。