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と同じ文字の特殊ファイルを作成する方法やこれをさらに進める方法はありますか?
t_open()
およびそれに関連する/dev/tcp
などは TLI/XTIインターフェイス の一部であり、BSDソケットへのTCP/IPAPIの戦いに敗れました。
Linuxには、ある種の/dev/tcp
があります。実際のファイルやカーネルデバイスではありません。それは何か 特にBashによって提供されます 、そしてそれはリダイレクトのためだけに存在します。これは、カーネル内の/dev/tcp
ファシリティを作成したとしても、99%[*]の時間でシェルによってインタラクティブにマスクされることを意味します。
最善の解決策は、実際にはBSDソケットに切り替えることです。ごめんなさい。
strxnet XTIエミュレーションレイヤーを機能させることができるかもしれませんが、XTIを降りるのに時間をかけたほうがよいでしょう。これは死んだAPIであり、Linuxだけでなく、OSXを含むBSDでもサポートされていません。
(ちなみに、strxnetライブラリはLinuxカーネルのコンポーネントである LiS に依存しているため、BSD上に構築することすらできません。ストックBSDまたはOSXではconfigure
すらしません。システム、明らかにGNU sed。)にも依存しているため
[*]この大げさな推測は、私が使用したすべてのLinuxディストリビューションでroot以外のユーザーのデフォルトのシェルがBashであるという事実に基づいています。したがって、Bash以外のものを入手するには、原則としてLinuxで邪魔にならないようにする必要があります。