linux sock cloexec Linux中的SOCK_CLOEXEC是一个非常重要的标志位,它可以在使用socket创建文件描述符时自动设置close-on-exec标志位,从而保证当进程执行时,不会将该文件描述符传递给其子进程。 在Linux的Socket编程中,为了保证安全性和可靠性,我们经常会使用SOCK_CLOEXEC选项来避免发生潜在的安全漏洞。通过设置这个标志...
回到我们的应用场景中来,只要我们在创建socket的时候加上SOCK_CLOEXEC标志,就能够达到我们要求的效果,在fork子进程中执行exec的时候,会清理掉父进程创建的socket。 #ifdef WIN32 SOCKET ss = ::socket(PF_INET, SOCK_STREAM, 0); #else SOCKET ss = ::socket(PF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0); #...
SOCK_NONBLOCK . 非阻塞,也可以使用fcntl()来做这个事情 SOCK_CLOEXEC 在执行 exec 时关闭该描述符,相当于 FD_CLOEXEC protocol:当type为SOCK_RAW时需要设置此值说明协议类型,其他类型设置为0即可, 对于protocol为0(IPPROTO_IP)的raw socket。用于接收任何的IP数据包。其中的校验和和协议分析由程序自己完成 返回值...
内核会为新的socket分配一个套接字实例(struct socket)。 这个实例中包含了操作这个socket所需要的所有方法,例如数据发送、接收、状态查询等。 对于AF_INET和SOCK_STREAM,这通常意味着创建一个TCP套接字。 返回文件描述符: 最后,内核会将这个套接字实例与一个文件描述符关联起来,并返回给用户空间。 文件描述符是一...
protocol:表示一个传输层协议号,传输层的协议包括IPPROTO_TCP,IPPROTO_UDP;或者对于SOCK_RAW来讲,它是一个通配协议号IPPROTO_IP,用于通配网络层的附属协议ICMP,IGMP等。对于传输层协议来讲,IPPROTO_TCP对应的套接字类型总是SOCK_STREAM,IPPRTO_UDP对应的套接字类型总是STREAM_DGRAM,所以在socket系统调用时,可以不必...
BUILD_BUG_ON(SOCK_NONBLOCK & SOCK_TYPE_MASK); flags = type & ~SOCK_TYPE_MASK; if(flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK)) return-EINVAL; type &= SOCK_TYPE_MASK; if(SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
struct socket *sock; int flags; /* Check the SOCK_* constants for consistency. */ BUILD_BUG_ON(SOCK_CLOEXEC != O_CLOEXEC); BUILD_BUG_ON((SOCK_MAX | SOCK_TYPE_MASK) != SOCK_TYPE_MASK); BUILD_BUG_ON(SOCK_CLOEXEC & SOCK_TYPE_MASK); ...
还可以接受两个标志:SOCK_NONBLOCK(将新创建的socket设为非阻塞)和SOCK_CLOEXEC(用fork调用创建子进程时在子进程中关闭该socket) protocol:在前两个参数构成的协议集合下,再选择一个具体的协议。几乎所有情况,把它设置为0. 成功时返回socket文件描述符,失败则返回-1并设置errno。
BUILD_BUG_ON(SOCK_CLOEXEC & SOCK_TYPE_MASK); BUILD_BUG_ON(SOCK_NONBLOCK & SOCK_TYPE_MASK); flags = type & ~SOCK_TYPE_MASK; if(flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK)) return-EINVAL; type &= SOCK_TYPE_MASK; if(SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK)) ...
// net/socket.c SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) { ... struct socket *sock; ... flags = type & ~SOCK_TYPE_MASK; if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK)) return -EINVAL; type &= SOCK_TYPE_MASK; ... retval = sock_create(family, type, pro...