私は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;
}
> 0
UNIXでは、Linuxのソケット_id値はです-1
。その理由は、UNIXにはLinuxには/dev/tcp
。また、UNIXでは、このtcp
ファイルは通常のファイルとは異なる文字特殊ファイルです。
UNIXと同様に、Linuxでも同じ文字特殊ファイルを生成する方法はありますか?それとも、さらに進む方法はありますか?
答え1
t_open()
そしてそれに関連する/dev/tcp
内容はTLI/XTIインターフェース、TCP / IP APIとBSDソケット間の戦いで敗北しました。
Linuxには/dev/tcp
あらゆる種類があります。実際のファイルやカーネルデバイスではありません。これはものです。バッシュ特別オファーで、リダイレクトにのみ使用されます。これは、カーネル内部/dev/tcp
機能が生成されても、シェルの対話型使用が99%[*]ブロックされることを意味します。
最善の解決策は、実際にBSDソケットに切り替えることです。申し訳ありません。
あなたは得ることができますスターネットXTIエミュレーションレイヤーは機能しますが、時間をかけてXTIを削除する方が良いでしょう。これは死んだAPIであり、LinuxだけでなくBSD(OS Xを含む)でもサポートされていません。
(ところで、strxnetライブラリはBSDに依存しているため、BSDに基づいて構築されていません。リチウム硫黄、Linuxカーネルのコンポーネントです。configure
GNU sedに依存するため、通常のBSDやOS Xシステムでも動作しません。 )
[*]私の推測は、Bashが私が使用したすべてのLinuxディストリビューションでroot以外のユーザーのためのデフォルトシェルであるという事実に基づいています。したがって、一般的にLinuxでは、Bash以外のものを手に入れようとする必要があります。