accept系統呼叫核心實現

2021-09-06 17:30:45 字數 2525 閱讀 1047

使用者態對accept的標準使用方法:

if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)

sockfd是通過socket系統呼叫,而且經過listen過的套接字:

sockfd = socket(af_inet, sock_stream, 0)

listen(sockfd, 128)

remote_addr將會儲存遠端裝置的位址資訊。

/* * for accept, we attempt to create a new socket, set up the link

* with the client, wake up the client, then return the new

* connected fd. we collect the address of the connector in kernel

* space and move it to user at the very end. this is unclean because

* we open the socket then return an error.

* * 1003.1g adds the ability to recvmsg() to query connection pending

* status to recvmsg. we need to add that support in a way thats

* clean when we restucture accept also.

*/asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr,

int __user *upeer_addrlen)

//使得這個newsock繫結剛才新建的newfile

//即如今為止,newfd newfile newsock之間是有關聯的

err = sock_attach_fd(newsock, newfile);

if (err < 0)

goto out_fd_******;

err = security_socket_accept(sock, newsock);

if (err)

goto out_fd;

//newsock是socket結構體,sock->ops->accept的目的是為newsock關聯乙個sock結構體

//即三次握手結束後,新建的sock傳輸控制塊,它等待使用者accept系統呼叫「領養」它。

//sock->ops->accept相應的函式是inet_accept

err = sock->ops->accept(sock, newsock, sock->file->f_flags);

if (err < 0)

goto out_fd;

if (upeer_sockaddr)

err = move_addr_to_user(address, len, upeer_sockaddr,

upeer_addrlen);

if (err < 0)

goto out_fd;

}.........................................}/*

* accept a pending connection. the tcp layer now gives bsd semantics.

*/int inet_accept(struct socket *sock, struct socket *newsock, int flags)

/* * this will accept the next outstanding connection.

*///inet_csk_accept的功能時獲取建立3次握手後的sk,一次呼叫返回乙個sk

struct sock *inet_csk_accept(struct sock *sk, int flags, int *err)

//reqsk_queue_get_child的邏輯是:

//1:取出icsk_accept_queue的request_sock,然後取出request_sock中的sk

//2:listen的sk中,sk_ack_backlog計數減一,sk->sk_ack_backlog--,由於sk_ack_backlog有上限。

//3:刪除request_sock

//4:return取出的sk

newsk = reqsk_queue_get_child(&icsk->icsk_accept_queue, sk);

warn_on(newsk->sk_state == tcp_syn_recv);

out:

release_sock(sk);

return newsk;

out_err:

newsk = null;

*err = error;

goto out;

}

tcp listen呼叫和accept呼叫

在看listen的 之前.我們也先來看相關的資料結構 inet connection sock它包含了乙個icsk accept queue的域,這個域是乙個request sock queue型別,我們就先來看這個結構 request sock queue也就表示乙個request sock佇列....

核心新增系統呼叫

在 windows 下新增系統呼叫不像 linux 那樣容易,windows 系統呼叫與使用者程式之間還有 ntdll.dll 層,而這一層微軟沒有提供源 但是我們從系統呼叫的實現機制出發,不管是在 linux 還是windows 系統呼叫的實現都是通過中斷來實現的,可以利用中斷的方式呼叫新新增的系...

linux核心之系統呼叫

應用程式與系統呼叫 使用者應用程式訪問並使用核心所提供的各種服務的途徑,就是系統呼叫,系統呼叫介面層作為核心和使用者應用程式之間的中間層,扮演了乙個橋梁,系統呼叫把應用程式的請求傳達給核心,核心處理完後,把結果返回給應用程式。應用程式通過作業系統提供的應用程式設計介面api而不是直接通過系統呼叫來程...