Lucy
Lucy

Reputation: 241

Bad file descriptor

I'm learning about file descriptors and I wrote this code:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

int fdrd, fdwr, fdwt;
char c;

main (int argc, char *argv[]) {

    if((fdwt = open("output", O_CREAT, 0777)) == -1) {
        perror("Error opening the file:");
        exit(1);
    }

    char c = 'x';

    if(write(fdwt, &c, 1) == -1) {
        perror("Error writing the file:");
    }

    close(fdwt);
    exit(0);

}

, but I'm getting: Error writing the file:: Bad file descriptor

I don't know what could be wrong, since this is a very simple example.

Upvotes: 22

Views: 103773

Answers (4)

Mutje
Mutje

Reputation: 1

My problem was that I used the S_IRUSR constant, which then, combined with O_CREAT created a file that can't be written to. So first run was OK, but on the second run I got the Bad file descriptor error message.

Using S_IRUSR | S_IWUSR solved the problem. Of course the badly created files have to be deleted.

int outfd = open("output.ppm", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);

Upvotes: 0

spacehunt
spacehunt

Reputation: 823

According to the open(2) man page:

The argument flags must include one of the following access modes: O_RDONLY, O_WRONLY, or O_RDWR.

So yes, as suggested by others, please change your open to open("output", O_CREAT|O_WRONLY, 0777));. Use O_RDWR if you need to read from the file. You may also want O_TRUNC -- see the man page for details.

Upvotes: 11

patapizza
patapizza

Reputation: 2398

Try this:

open("output", O_CREAT|O_WRONLY, 0777)

Upvotes: 31

RedX
RedX

Reputation: 15175

I think O_CREAT alone is not enough. Try adding O_WRONLY as flag to the open command.

Upvotes: 10

Related Questions