hgiesel
hgiesel

Reputation: 5658

What is represented by the content of FILE*

I have this program

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <fcntl.h>

int main(void)
{
    FILE* f = fopen("/Users/user/a.cc", "rb");
    printf("%i\n", f);  // 1976385616
    printf("%i\n", *f);  // 1976385768

    int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
    printf("%i\n", sockfd);  // 4

    fclose(f);
    close(sockfd);

    int fd = open("/Users/user/a.cc", O_TRUNC | O_WRONLY, 0);
    printf("%i\n", (int) fd); // 3
    close(fd);
}

I know that 3 and 4 represents the file descriptors with 0, 1, 2 being stdin, stdout and stderr respectively. Obviously fopen doesn't use a file descriptor.

What does the value of FILE* represent? How does fopen if not with file descriptors?

Upvotes: 2

Views: 260

Answers (1)

Maxim Egorushkin
Maxim Egorushkin

Reputation: 136425

What does the value of FILE* represent?

It is a pointer to FILE structure, for glibc its definition is here. Which, among other things, contains the file descriptor. You can get the file descriptor from FILE* using POSIX fileno function.

For more details you may like having a look into Interaction of File Descriptors and Standard I/O Streams.

Upvotes: 1

Related Questions