// socket初始化
// 调用路径:inet_create->sock_init_data
1.1 void sock_init_data(struct socket *sock, struct sock *sk)
{
...
//sock状态改变的回调函数,当sock的状态变迁(如从established到close_wait)就会调用这个函数
sk->sk_state_change = sock_def_wakeup;
//sock有输入数据的时被调用
sk->sk_data_ready = sock_def_readable;
//sock有可写空间时被调用
sk->sk_write_space = sock_def_write_space;
//sock出错(如收到一个rst)会被调
sk->sk_error_report = sock_def_error_report;
sk->sk_destruct = sock_def_destruct;
...
}
// 唤醒sock上阻塞的进程
// 步骤:
// 1.检查struct sock->sk_wq上是否有阻塞的进程
// 1.2 唤醒struct sock->sk_wq上的进程
2.1 static void sock_def_wakeup(struct sock *sk)
{
struct socket_wq *wq;
rcu_read_lock();
wq = rcu_dereference(sk->sk_wq);
if (wq_has_sleeper(wq))
wake_up_interruptible_all(&wq->wait);
rcu_read_unlock();
}
// 有可用输入数据
// 调用路径:raw_local_deliver->sock_def_readable
// 步骤:
// 1.检查struct sock->sk_wq上是否有阻塞的进程
//
网络子系统84_sock事件通知进程
最新推荐文章于 2023-06-05 16:54:09 发布
本文介绍了Linux内核网络子系统中,socket初始化过程以及在状态改变、数据就绪、可写空间和错误发生时的回调函数,包括sock_def_wakeup、sock_def_readable、sock_def_write_space和sock_def_error_report的详细工作流程,这些函数用于唤醒阻塞的进程并处理IO信号。
摘要由CSDN通过智能技术生成