在Linux中使用C语言,如何确定文件描述符是附加到文件还是套接字?
问问题
521 次
3 回答
7
或者,您可以使用fstat
和S_ISSOCK
宏。
int main(int argc, char *argv[])
{
int fds[2];
fds[0] = 0; //stdin
fds[1] = socket(AF_INET,SOCK_STREAM, 0);
for (int i = 0; i < 2; ++i)
{
struct stat statbuf;
if (fstat(fds[i], &statbuf) == -1)
{
perror("fstat");
exit(1);
}
if (S_ISSOCK(statbuf.st_mode))
printf("%d is a socket\n", fds[i]);
else
printf("%d is NOT a socket\n", fds[i]);
}
return(0);
}
于 2013-11-11T02:45:53.257 回答
7
用于getsockopt
获取SO_TYPE
文件描述符。如果它不是套接字,它将返回-1
错误ENOTSOCK
:
int fd = /* ... */;
bool is_socket;
int socket_type;
socklen_t length = sizeof(socket_type);
if(getsockopt(fd, SOL_SOCKET, SO_TYPE, &socket_type, &length) != -1) {
is_socket = true;
} else {
if(errno == ENOTSOCK) {
is_socket = false;
} else {
abort(); /* genuine error */
}
}
/* whether it is a socket will be stored in is_socket */
于 2013-11-11T02:16:16.343 回答
0
套接字不支持查找或调用具有非零位置的 pread(2) 或 pwrite(2)。
因此,另一种选择是执行其中一个不受支持的操作,看看是否出现错误。如果您设法寻找,那么 FD 可能是一个文件(或一个设备)。否则它可能是一个套接字。或者一根管子。
于 2013-11-11T05:48:21.063 回答