web-dev-qa-db-ja.com

/ dev / tcpはLinuxに存在しません

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と同じ文字の特殊ファイルを作成する方法やこれをさらに進める方法はありますか?

9

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で邪魔にならないようにする必要があります。

18
Warren Young