开发者

can a process create extra shell-redirectable file descriptors?

开发者 https://www.devze.com 2023-01-10 09:06 出处:网络
C开发者_如何学Can a process \'foo\' write to file descriptor 3, for example, in such a way that inside a bash shell one can do

C开发者_如何学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)?


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


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


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号