close与shutdown系统调用

使用多线程时,pthread_create的参数flag有CLONE_FILES, 最终调用do_fork(),并且会根据CLONE_FILES标志来调用copy_files()来共享父进程中的文件描述符(这里包括socketfd)。

使用多进程时,fork的参数flag没有CLONE_FILES, 最终调用do_fork(),子进程会把文件描述符的引用计数加一,即把struct files_struct成员f_count++。

在单进程、单线程、多线程时,close()会调用tcp_close();

在多进程时,只是减少f_count引用计数,在f_count为0时才会调用tcp_close()。

而shutdown()与进程线程类型无关,都是直接调用tcp_shutdown()。

NAME
shutdown - shut down part of a full-duplex connection

SYNOPSIS
#include <sys/socket.h>

int shutdown(int sockfd, int how);

DESCRIPTION
The shutdown() call causes all or part of a full-duplex connection on the socket associated with sockfd
to be shut down. If how is SHUT_RD, further receptions will be disallowed. If how is SHUT_WR, further
transmissions will be disallowed. If how is SHUT_RDWR, further receptions and transmissions will be
disallowed.

NAME
close - close a file descriptor

SYNOPSIS
#include <unistd.h>

int close(int fd);

DESCRIPTION
close() closes a file descriptor, so that it no longer refers to any file and may be reused. Any record
locks (see fcntl(2)) held on the file it was associated with, and owned by the process, are removed
(regardless of the file descriptor that was used to obtain the lock).

If fd is the last file descriptor referring to the underlying open file description (see open(2)), the
resources associated with the open file description are freed; if the descriptor was the last reference
to a file which has been removed using unlink(2) the file is deleted.

时间: 2024-12-14 18:41:16

close与shutdown系统调用的相关文章

《TCP/IP详解卷2:实现》笔记--选路插口

一个进程使用选路域(routing domain)中的一个插口来发送和接收选路报文,socket系统调用需要制定一个PF_ROUTE 的族类型和一个SOCK_RAW的插口类型.该进程可以向内核发送以下五种选路报文: 1.RTM_ADD:增加一条新路由. 2.RTM_DELETE:删除一条已经存在的路由. 3.RTM_GET:取得有关一条路由的所有信息. 4.RTM_CHANGE:改变一条已经存在路由的网关.接口或者度量. 5.RTM_LOCK:说明内核不应该修改哪个变量. 本章简介选路域.为每个

TCP协议详解(下)

 TCP协议详解 TCP状态转移 TCP连接的任意一端在任一时刻都处于某种状态,当前状态可以通过netstat命令查看,这里我们主要讨论TCP连接葱白建立到关闭的整个过程中通信两端状态的变化.如图是TCP状态转移过程. 图中,粗虚线表示典型的服务器连接的状态转移:粗实线显示典型的客户端连接的状态转移. TCP状态转移总图 服务器转移过程,这里我们说的连接状态指定是该连接的服务器状态. 服务器通过listen系统调用进入LISTEN状态,被动等待客户端连接,因此执行的是所谓的被动打开.服务器一

《TCP/IP详解卷2:实现》笔记--插口层

插口层的主要功能是将进程发送的与协议有关的请求映射到产生插口时指定的与协议有关的实现.下图说明了进程中的插口 接口与内核中的协议实现之间的层次关系. 1.socket结构 插口代表一条通信链路的一端,存储或指向与链路有关的所有信息.这些信息包括:使用的协议.协议的状态信息(包括 源和目的地址).到达的链接队列.数据缓存和可选标志.下图给出了插口和与插口相关的缓存的定义. so_type由产生插口的进程指定,指明插口和相关协议支持的通信语义.对于UDP,为SOCK_DGRAM,对于TCP,为 SO

TCP之半关闭与CLOSE_WAIT

终止一个连接要经过4次握手.这由TCP的半关闭(half-close)造成的.既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独立通道),因此每个方向必须单独地进行关闭. 这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接.当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送.发送FIN通常是应用层对socket进行关闭的结果. 例如:TCP客户端发送一个FIN,用来关闭从客户到服务器的数据传送. 半关闭对

Linux close

{ //https://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html 1. send解析 sockfd:指定发送端套接字描述符. buff:    存放要发送数据的缓冲区 nbytes:  实际要改善的数据的字节数 flags:   一般设置为0 1) send先比较发送数据的长度nbytes和套接字sockfd的发送缓冲区的长度,如果nbytes > 套接字sockfd的发送缓冲区的长度, 该函数返回SOCKET_ERROR;

Linux系统调用列表(转)

以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的. 按照惯例,这个列表以man pages第2节,即系统调用节为蓝本.按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使用,不允许用户调用的系统调用,对个别本人稍觉不妥的地方作了一些小的修改,并对所有列出的系统调用附上简要注释. 其中有一些函数的作用完全

shutdown详解

linux下shutdown命令详解 shutdown命令安全地将系统关机. 有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的.因为linux与windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失﹐使系统处于不稳定的状态﹐甚至在有的系统中会损坏硬件设备. 而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭.并且login指令会被冻结﹐即新的用户不能再登录.直接关机或者延迟一定的时间才关机都是可能的﹐还可能重启.这是由所有进

操作系统原理(一)——系统调用的原理及实现

系统调用:原理及实现 1. 什么是系统调用 在计算机中,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向操作系统内核请求需要更高权限运行的服务.系统调用提供了用户程序与操作系统之间的接口(即系统调用是用户程序和内核交互的接口). 操作系统中的状态分为管态(核心态)和目态(用户态).大多数系统交互式操作需求在内核态执行.如设备IO操作或者进程间通信.特权指令:一类只能在核心态下运行而不能在用户态下运行的特殊指令.不同的操作系统特权指令会有所差异,但是一般来说主要

[Linux]Linux系统调用列表

本文列出了大部分常见的Linux系统调用,并附有简要中文说明. 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的. 按照惯例,这个列表以man pages第2节,即系统调用节为蓝本.按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使用,不允许用户调用的系统调用,对个别本人稍觉不妥的地方作了一些小的修改