can't close stdin/stdout in shell


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting can't close stdin/stdout in shell
# 8  
Old 02-18-2010
Yes, I meant redirect, not close. In boiling down the problem to its minimum I found that they didn't even need to be closed to cause this. I noticed I'd titled the thread wrong a minute after I posted but it wouldn't let me fix it.

Why would you redirect stdin/stdout to /dev/null? Daemons do it all the time. That way, stdout and stdin never hang but never go anywhere either, and the fd's can't get recycled when you open a new file.

I've finally realized what's going on, and why my question is silly. I'm not sure what I was thinking, and can't even blame this one on lack of caffiene Smilie Sorry.
# 9  
Old 02-18-2010
Code:
 That way, stdout and stdin never hang but never go anywhere either

Cool! Still learning this stuff Smilie
But I meant why would you redirect /dev/null into stdin? The reverse makes sense..

Sometimes caffeine makes you overthink stuff. Glad you got it worked out.
# 10  
Old 02-18-2010
Quote:
Originally Posted by mandelbrot333
But I meant why would you redirect /dev/null into stdin? The reverse makes sense..
You can read from /dev/null too. Or rather, it does about the same thing writing to it does -- nothing.
Code:
$ strace echo > /dev/null
execve("/bin/echo", ["echo"], [/* 26 vars */]) = 0

...

write(1, "\n"..., 1)                    = 1
close(1)                                = 0
munmap(0xb7fde000, 4096)                = 0
close(2)                                = 0
exit_group(0)                           = ?

$ strace cat /dev/null
execve("/bin/cat", ["cat", "/dev/null"], [/* 26 vars */]) = 0

...

open("/dev/null", O_RDONLY|O_LARGEFILE) = 3

...

read(3, ""..., 4096)                    = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
$

Writing to /dev/null always returns success, and reading from /dev/null always returns EOF. So redirecting /dev/null into stdin means nothing will ever hang trying to read from stdin, reads instantly fail. This is better than just closing stdin since it's more graceful than a screenful of "bad file descriptor" errors and prevents the kernel from recycling FD 0 as the next file you open.

Last edited by Corona688; 02-18-2010 at 03:02 PM..
# 11  
Old 02-18-2010
Quote:
Originally Posted by Corona688
Code:
#!/bin/sh
exec 0</dev/null
exec 1>/dev/null

ls -l /proc/self/fd >&2

produces
Code:
total 0
lr-x------ 1 tyler users 64 Feb 18 10:38 0 -> /proc/7886/fd
lrwx------ 1 tyler users 64 Feb 18 10:38 1 -> /dev/pts/4
lrwx------ 1 tyler users 64 Feb 18 10:38 2 -> /dev/pts/4

I've verified the shell is actually redirecting stdout as expected, but when I run ls it is not inheriting this change. If I leave out the >&2, it produces no output, meaning it's only re-redirecting stdout to my console when I don't redirect stdout into stderr -- in other words, it only redirects stdout back to the console when I tell it not to use stdout at all! Why is it restoring stdout at all?
As far as I can see, the shell is doing everything exactly right. You have stdout directed to /dev/null and stderr directed to the console (by default). When you do:
Code:
ls -l /proc/self/fd >&2

you redirect stdout away from /dev/null and to where stderr is pointing (the console).

Please tell us what exactly you are trying to acomplish.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

[stdin / stdout] Strategies for redirecting outputs

Well.. let's say i need to write a pretty simple script. In my script i have 2 variables which can have value of 0 or 1. $VERBOSE $LOG I need to implement these cases: ($VERBOSE = 0 && $LOG = 0) => ONLY ERROR output (STDERR to console && STDOUT to /dev/null) ($VERBOSE = 1... (5 Replies)
Discussion started by: Marmz
5 Replies

2. UNIX for Advanced & Expert Users

How to set font color for STDIN,STDOUT and STDERR?

I want to differentiate the STDOUT and STDERR messages in my terminal . If a script or command is printing a message in terminal I want to differentiate by colors, Is it possible ? Example: $date Wed Jul 27 12:36:50 IST 2011 $datee bash: datee: command not found $alias ls alias... (2 Replies)
Discussion started by: ungalnanban
2 Replies

3. UNIX for Dummies Questions & Answers

STDIN and STDOUT

Hallo, i have a script like: if ;then echo "OK" else echo "ERROR $2 is missing" fi; if ;then touch $2 fi; if ;then cat $1 | grep xy > $2 (1 Reply)
Discussion started by: eightball
1 Replies

4. Programming

read and write stdin/stdout in unix

Hi, i am using the below program to read from the standard input or to write to standard out put. i know that using highlevel functions this can be done better than what i have done here. i just want to know is there any other method by which i find the exact number of characters ( this... (3 Replies)
Discussion started by: MrUser
3 Replies

5. Programming

Controlling a child's stdin/stdout (not working with scp)

All, Ok...so I know I *should* be able to control a process's stdin and stdout from the parent by creating pipes and then dup'ing them in the child. And, this works with all "normal" programs that I've tried. Unfortunately, I want to intercept the stdin/out of the scp application and it seems... (9 Replies)
Discussion started by: DreamWarrior
9 Replies

6. Shell Programming and Scripting

Redirecting stdin/stdout to/from command from/to string

Hi, I am working on a project where I have to generate and execute nasm code on-the-fly. I generate the code in a file program.asm and then execute it.This output is to stdout which i redirect to an output file which i read back to compare results: system("nasm -f elf program.asm >... (5 Replies)
Discussion started by: doc_cypher
5 Replies

7. UNIX for Dummies Questions & Answers

Redirect stdin stdout to multiple files

Hi, i know how to a) redirect stdout and stderr to one file, b) and write to two files concurrently with same output using tee command Now, i want to do both the above together. I have a script and it should write both stdout and stderr in one file and also write the same content to... (8 Replies)
Discussion started by: ysrini
8 Replies

8. Programming

stdout/stdin + flushing buffers

Hi all I've run into a snag in a program of mine where part of what I entered in at the start of run-time, instead of the current value within printf() is being printed out. After failing with fflush() and setbuf(), I tried the following approach void BufferFlusher() { int in=0;... (9 Replies)
Discussion started by: JamesGoh
9 Replies

9. Shell Programming and Scripting

Wrapper script for image deployment - stdin/stdout - named pipes and the like

Hi everyone, first post here. Anyone who isn't interested in the background, press pagedown :). I sometimes need to make scripts for little things I need in the infrastructure at the company I work at. Currently I am trying to make a wrapper script for a proprietary image-deployment program.... (2 Replies)
Discussion started by: andreas.ericson
2 Replies

10. Programming

C++ How to use pipe() & fork() with stdin and stdout to another program

Hi, Program A: uses pipe() I am able to read the stdout of PROGAM B (stdout got through system() command) into PROGRAM A using: * child -> dup2(fd, STDOUT_FILENO); -> execl("/path/PROGRAM B", "PROGRAM B", NULL); * parent -> char line; -> read(fd, line, 100); Question:... (2 Replies)
Discussion started by: vvaidyan
2 Replies
Login or Register to Ask a Question