Question

Can a process 'foo' write to file descriptor 3, for example, in such a way that inside a bash shell one can do

foo 1>f1 2>f2 3>f3

and if so how would you write it (in C)?

Was it helpful?

Solution

The shell opens the file descriptors for your program before executing it. Simply use them like you would any other file descriptor, e.g. write(3, buf, len); etc. You may want to do error checking to make sure they were actually opened (attempting to dup them then closing the duplicate would be one easy check).

OTHER TIPS

You can start your command with:

./foo 2>/dev/null 3>file1 4>file2 

Then if you ls -l /proc/_pid_of_foo_/fd you will see that file descriptors are created, and you can write to them via eg.:

write(3,"abc\n",4);

It would be less hacky perhaps if you checked the file descriptor first (with fcntl?).

No.

The file descriptors are opened by the shell and the child process inherits them. It is not the child process which opens these command-line accessible file descriptors, it is the bash process.

There might be a way to convince bash to open additional file descriptors on behalf of the process. That wouldn't be portable to other shells, and I'm not sure if a mechanism even exists -- I am just speculating.

The point is that you can't do this from coding the child process in a special way. The shell would have to abide your desires.

Can a process 'foo' write to file descriptor 3, for example, in such a way that inside a bash shell one can do [...] and if so how would you write it (in C)?

I'm not sure what you are precisely after, but whatever it is, starting point going to be the man dup/man dup2 - this is how the shells make out of a random file descriptor a file descriptor with given number.

But obviously, the process foo has to know somehow that it can write to the file descriptor 3. POSIX only specifies 0, 1 and 2: shell ensures that whatever is started gets the file descriptors and libc in application's context also expects them to be the stdin/stdout/stderr. Starting from 3 and beyond - is up to application developer.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top