Sponsored Content
Top Forums Shell Programming and Scripting Redirecting stdin from fd 3-9? Post 302350396 by Azhrei on Thursday 3rd of September 2009 04:13:14 PM
Old 09-03-2009
Actually, it can be done, but it's a bit ugly.

The problem is that when you run the job in the background, it's the background shell that creates fd4 and the parent (your command line shell) will know nothing about it. Because there's no one with fd4 opened for writing, the background job will immediately read EOF and terminate.

Something like this will give you a better shot:
Code:
exec >&4
./myprogram <&4 &
echo "message to program"

The first line redirects stdout to fd4 and leaves it turned on so that future data sent to stdout will go to fd4. (Writing an echo statement afterwards that goes to the real stdout is left as an exercise for the student. Smilie)

Now when you execute myprogram in the background, there will be a fd4 available so you won't get the error message, and fd4 will become stdin for that job.

Now when you print something to stdout it will go to the background job.

Using a FIFO (named pipe) will be similar. The important thing about named pipes is to open the reader first -- you'll get an error if you attempt to open the writer first (EPIPE on many system, "Attempt to write on a pipe with no readers").

If you have to stick with bash, then use one of the above techniques. But you're much better off (if possible) using a HERE document or the Korn shell's coprocess ability.
 

10 More Discussions You Might Find Interesting

1. Programming

stdin

hi, how does a program know whether some data are available from stdin? I would like to make a program which could read its data from stdin and _if_there_is_nothing_at_stdin_ from a file which name is given as an argument. If there is nothing in stdin and no filename is given as argument,... (2 Replies)
Discussion started by: marquis
2 Replies

2. HP-UX

stdin device on HP

How can I access the standard-in device in HP-UX? I am trying to automate sftp on an HP-UX system. On solaris I can just do: sftp -b /dev/fd/0 remotehost <<EOF cd pub ascii get filename.txt bye EOF (2 Replies)
Discussion started by: dangral
2 Replies

3. Shell Programming and Scripting

redirection stdin

hello all, I need to create a password change utility for a database. I need to gather at the command line the username, password and database sid. I have the program currently doing this. What I would like to do is not have the new password appear on the screen when I do my read command.... (2 Replies)
Discussion started by: whited05
2 Replies

4. Shell Programming and Scripting

redirect STDIN

can you redirect STDIN with command arguments? I have tried this approach: # ./script -option <argument1> <argument2> 0<$2 # $2: ambiguous redirect Is this possible? (4 Replies)
Discussion started by: prkfriryce
4 Replies

5. Shell Programming and Scripting

Redirecting to stdin

Hi, I'm having trouble with my script. I have to select different choices without any interaction from a menu that looks like : a - xxxxxxxxxxxxxx b - xxxxxxxxxxxxxx c - xxxxxxxxxxxxxx d - xxxxxxxxxxxxxx I tried things like : echo "a" >&0 read < echo "a" but none worked. Any... (4 Replies)
Discussion started by: flame_eagle
4 Replies

6. Programming

How to write to stdin of another program (program A -> [stdin]program B)

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: ---------... (1 Reply)
Discussion started by: vvaidyan
1 Replies

7. UNIX for Dummies Questions & Answers

How to write to stdin of another program (program A -> [stdin]program B)

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: ---------... (3 Replies)
Discussion started by: vvaidyan
3 Replies

8. UNIX for Dummies Questions & Answers

fork and stdin

When a process fork(), the child share the same file descriptors as his father. Thus, they share the same stdin. Quick and dirty exemple below (sorry for the ugly gets() call) : #include <stdio.h> #include <unistd.h> int main() { char buf; if (fork()) { /*parent */ ... (1 Reply)
Discussion started by: milouz
1 Replies

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

10. 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
bg(1)							      General Commands Manual							     bg(1)

NAME
bg - Runs jobs in the background SYNOPSIS
bg [job_id...] Note The C shell has a built-in version of the bg command. If you are using the C shell, and want to guarantee that you are using the command described here, you must specify the full path /usr/bin/bg. See the csh(1) reference page for a description of the built-in command. STANDARDS
Interfaces documented on this reference page conform to industry standards as follows: bg: XCU5.0 Refer to the standards(5) reference page for more information about industry standards and associated tags. OPTIONS
None OPERANDS
Specifies the job to be resumed as a background job. If no job_id operand is given, the most recently suspended job is used. The format of job_id is described in the Jobs section of the ksh(1) reference page. DESCRIPTION
If job control is enabled (see the description of set -m in the ksh(1) reference page), the bg utility resumes suspended jobs from the cur- rent environment by running them as background jobs. If the job specified by job_id is a job already running in the background, the bg utility has no effect and will exit successfully. Using bg to place a job into the background causes its process ID to become "known in the current shell execution environment", as if it had been started as an asynchronous list. See the Jobs section of the ksh(1) reference page. RESTRICTIONS
If job control is disabled, the bg utility exits with an error and no job is placed in the background. The bg utility does not work as expected when it is operating in its own utility execution environment because that environment has no suspended jobs. EXIT STATUS
The following exit values are returned: Successful completion. An error occurred. ENVIRONMENT VARIABLES
The following environment variables affect the execution of bg: Provides a default value for the internationalization variables that are unset or null. If LANG is unset or null, the corresponding value from the default locale is used. If any of the internationalization vari- ables contain an invalid setting, the utility behaves as if none of the variables had been defined. If set to a non-empty string value, overrides the values of all the other internationalization variables. Determines the locale for the interpretation of sequences of bytes of text data as characters (for example, single-byte as opposed to multibyte characters in arguments). Determines the locale used to affect the format and contents of diagnostic messages written to standard error. Determines the location of message catalogues for the processing of LC_MESSAGES. SEE ALSO
Commands: csh(1), fg(1), jobs(1), kill(1), ksh(1), Bourne shell sh(1b), POSIX shell sh(1p), wait(1) Standards: standards(5) bg(1)
All times are GMT -4. The time now is 09:26 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy