views:

55

answers:

4

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)?

+1  A: 

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.

Heath Hunnicutt
@Heath: "That wouldn't be portable to other shells", I'm pretty sure that `N> whatever` notation is quite portable, at least for sh and bash. Though it is not very useful - unless the process actually knows that is has to write to the fd number N.
Dummy00001
+1  A: 

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.

Dummy00001
+3  A: 

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?).

hlynur
+2  A: 

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).

R..