考虑以下示例代码:
#include <sys/socket.h>
int main()
{
int sv[ 2 ] = { 0 };
socketpair( AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0, sv );
for( unsigned ii = 0; ii < 5; ++ii )
{
int* msg = new int( 123 );
if( -1 == send( sv[ 0 ], &msg, sizeof(int*), MSG_NOSIGNAL ) )
{
delete msg;
}
}
close( sv[0] );
sleep( 1 );
int* msg = 0;
int r;
while( ( r = read( sv[ 1 ], &msg, sizeof(int*) ) ) > 0 )
{
delete msg;
}
return 0;
}
显然,代码运行良好,但这并不意味着它不是 UB。
在手册页中找不到任何内容,这保证了当sv[ 0 ]
关闭时,read
仍然能够从 读取由sv[ 1 ]
发送的所有内容send
。
也许可以这样问这个问题 -作为read
返回0
和EOF
原样socketpair
,SOCK_STREAM
我希望EOF
一旦从套接字读取所有内容并且另一侧关闭,它将被“命中”。这个对吗?