4

LinuxでC言語を使用して、ファイル記述子がファイルまたはソケットに接続されているかどうかを判断する方法は?

4

3 に答える 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 に答える
0

socket(7) のマニュアルページによると:

ゼロ以外の位置での pread(2) または pwrite(2) のシークまたは呼び出しは、ソケットではサポートされていません。

したがって、別のオプションは、サポートされていない操作のいずれかを実行して、エラーが発生するかどうかを確認することです。なんとかシークできた場合、FD はおそらくファイル (またはデバイス) です。それ以外の場合は、ソケットの可能性があります。またはパイプ。

于 2013-11-11T05:48:21.063 に答える