我正在将 C/pro*c 代码从 UNIX 移植到 Linux。代码是:
#define __NFDBIT (8 * sizeof(unsigned long))
#define __FD_SETSIZ 1024
#define __FDSET_LONG (__FD_SETSIZ/__NFDBIT)
typedef struct {
unsigned long fds_bits [__FDSET_LONG];
} __ernel_fd_set;
typedef __ernel_fd_set fd_set_1;
int main()
{
fd_set_1 listen_set;
int listen_sd;
int socket_id;
FD_ZERO(&listen_set);
socket_id = t_open("/dev/tcp", O_RDWR|O_NONBLOCK, (struct t_info *) 0);
if ( socket_id <0 )
{
exit(FAILURE);
}
return 0;
}
在 UNIX 中,socket_id 的值> 0
在 Linux 中为-1
。原因是在 UNIX 中,有一个/dev/tcp
. Linux 上不存在这一点。同样在 UNIX 中,该tcp
文件是字符特殊文件,与普通文件不同。
有没有办法在 Linux 中创建与 UNIX 中相同的字符特殊文件,或者如何进一步进行?
答案1
t_open()
及其相关的/dev/tcp
内容是TLI/XTI 接口,它在 TCP/IP API 与 BSD 套接字的争夺战中失败了。
在 Linux 上,有/dev/tcp
各种各样的。它不是真正的文件或内核设备。这是一个东西Bash 特别提供,并且它仅用于重定向。这意味着即使要创建一个内核内/dev/tcp
设施,它也会在 99%[*] 的时间里被 shell 屏蔽在交互式使用中。
最好的解决方案确实是切换到 BSD 套接字。对不起。
您也许能够得到星网XTI 模拟层可以工作,但您最好花时间摆脱 XTI。这是一个死 API,不仅在 Linux 上不受支持,而且在 BSD(包括 OS X)上也不受支持。
(顺便说一句,strxnet 库甚至不会构建在 BSD 上,因为它依赖于锂硫,Linux 内核的一个组件。它甚至不会configure
在普通的 BSD 或 OS X 系统上运行,显然是因为它也依赖于 GNU sed。)
[*] 我的这种疯狂猜测是基于这样一个事实:Bash 是我使用过的所有 Linux 发行版中非 root 用户的默认 shell。因此,通常来说,在 Linux 上你必须不遗余力地获取 Bash 以外的东西。