用Accept4()设置SOCK_CLOEXEC标志的目的是什么?

what is the purpose to set SOCK_CLOEXEC flag with accept4() same as O_CLOEXEC

本文关键字:标志 是什么 CLOEXEC Accept4 设置 SOCK      更新时间:2023-10-16

基本上,我需要知道在使用Accept4()坐下时设置sock_cloexec的目的是什么。如何使用Accept的返回的文件描述符检查此标志的功能。

accepted_fd =   accept4(sd, (struct sockaddr *)& tcp_remote, &size,  SOCK_CLOEXEC);

SOCK_CLOEXEC存在的原因是避免从accept获取新套接字和之后设置FD_CLOEXEC标志之间。

通常,如果您希望文件描述符是关闭的EXEC,则首先以某种方式获取文件描述符,然后致电fcntl(fd, F_SETFD, FD_CLOEXEC)。但是在螺纹程序中,在获取该文件描述符(在这种情况下从accept)和设置CloExec标志之间有可能有竞赛条件。因此,Linux最近更改了大多数(如果不是全部)调用返回新文件描述符的系统调用,以接受告诉内核在使文件描述符有效之前,请告诉内核原子上设置关闭的EXEC标志。这样,比赛状况被关闭。

如果您想知道为什么要关闭Exec,这是因为在某些情况下,尤其是当您从特权程序执行非特权程序时,您不希望某些文件描述符泄露到该程序。