Shell Implementation not working correctly


 
Thread Tools Search this Thread
Top Forums Programming Shell Implementation not working correctly
# 1  
Old 11-04-2007
Shell Implementation not working correctly

Code:
	//save in/out
	int tmpin = dup(0);
	int tmpout = dup(1);
	
	//set initial input
	int fdin;
	if(_inputFile)
	{
	   fdin = open(_inputFile, O_RDONLY | O_CREAT, S_IREAD | S_IWRITE);
	}
	else
	{
	   //use default input
	   fdin = dup(tmpin);
	}

	int ret;
	int fdout;
	for(int i = 0; i < _numberOfSimpleCommands; i++)
	{
	   //redirect input
	   dup2(fdin, 0);
	   close(fdin);
	   //setup output
	   if(i == _numberOfSimpleCommands-1) 
	   {// last command must be set so output redirection is set

	      if(_outFile)
	      {
	         fdout = open(_outFile, O_WRONLY | O_CREAT, S_IREAD | S_IWRITE);
	      }
	      else
	      {  
	         fdout = dup(tmpout);
	      }
	   }
	   else
	   {
                   //simple command
	      //create pipe
	      int fdpipe[2];
	      pipe(fdpipe);
                  fdout = fdpipe[0];
                  fdin = fdpipe[1];
	    }

	    //redirect output
	    dup2(fdout, 1);
	    close(fdout);

	    //create child process
	    ret = fork();
	    if(ret == 0)
	    {
	       execvp((*_simpleCommands)[i]._arguments[0],(*_simpleCommands)[i]._arguments);
	       perror("execvp");
	       exit(1);
	     }//if ret
	}//for

	//restore in/out defaults
	dup2(tmpin, 0);
	dup2(tmpout, 1);
	close(tmpin);
	close(tmpout);
	
	if(!_background)
	{
		//wait for last command
		waitpid(ret, 0, 0);
	}

This is the code i have for the implementation of a shell that supports pipes and i/o redirection

So far this code has worked for one input and one outout redirection.
But will not work for pipeing, and i cannot for the life of me figure out why.
Ex. cat file1.cc | grep malloc

A simple command in my implementation is just a command with its arguments.

Any help would be great. Also please tell me if i need to clarify anything.

Last edited by AirBronto; 11-05-2007 at 03:12 PM..
# 2  
Old 11-04-2007
Just on code inspection....

I would close tmpin and tmpout in the child process.

Remember a child inherits every file descriptor, not just 0,1 and 2.

So the 2nd child will be holding the write end to it's own stdin open.
# 3  
Old 11-05-2007
This is how i see my code working with the file descriptors and pipes and well every thing. Take a look at the picture to see what i am talking about, it is very descriptive and took a long time to do in paint so please take a look.
# 4  
Old 11-06-2007
Quote:
Originally Posted by porter
I would close tmpin and tmpout in the child process.
Do you understand what I mean here?

After the fork, in the child's leg, close these descriptors because the child does not want/need/expect them.
# 5  
Old 11-06-2007
At the point when fork is called, the parent process is not pointing to the standard input and output, tmpin and tmpout. So wouldnt the child not have anything pointing to those after fork?
# 6  
Old 11-07-2007
As far as I can see both tmpin and tmpout are both open immediately prior to the fork and hence will be both be open for both parent and child.

A suggestion, whenever you close a file descriptor, put -1 in the variable holding it. Then put in some debugging code immediately after the fork as follows...

Code:
.....
ret=fork();
fprintf(stderr,"pid=%d,ppid=%d,tmpin=%d,tmpout=%d\n",
getpid(),getppid(),tmpin,tmpout);
fflush(stderr);
if (ret==0)
...

# 7  
Old 11-07-2007
See when i do something like this:
tmpin = dup(0);
I am just saving the fact that my parent process's 0th file descriptor was pointing to stdin in tmpin.

By the time my program gets to fork(), the 0th file descriptor is eather pointing to a new input file or stdin if there was not one. And in both cases the child will need were ever the 0th is pointing to. It may be tmpin or not but if it is it will need that open so it can use it.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Are the brains of the UNIXoid working correctly?

Today I saw the topic. sum-even-numbers-1-100 At that time, it was already closed but not the point. Other thoughts came to mind. All newcomers to Haskell are afraid that when they study it, their brains will turn inside out. I did not notice anything like that. And all because the brains of all... (4 Replies)
Discussion started by: nezabudka
4 Replies

2. UNIX for Dummies Questions & Answers

vnc No Longer Working Correctly

Hello All, Yesterday, all day, I was using x11vnc and vncviewer to connect to a server. But today for some reason it is not working. I don't remember changing any settings or anything like that, but because it stopped working correctly I guess something has...? I'm issuing the exact same... (0 Replies)
Discussion started by: mrm5102
0 Replies

3. Shell Programming and Scripting

awk not working correctly

Hi I am attempting to right a script which will read a table and extract specfic information. LASTFAILEDJOB=/usr/openv/netbackup/scripts/GB-LDN/Junaid/temp_files/lastfailedjob cat /usr/openv/netbackup/scripts/GB-LDN/Junaid/temp_files/lastfailedjob 237308646 If i run the following... (5 Replies)
Discussion started by: Junes
5 Replies

4. UNIX for Dummies Questions & Answers

Grep Regexp not working correctly

Consider the following code: grep -o -e '^STEAM_::\d+$' workfile3.tmp A sample format of a valid string for the regexp would be: STEAM_0:1:12345678 Here is an example line from the workfile3.tmp file: 465:L 01/02/2012 - 00:05:33: "Spartan1-1-7<8><STEAM_0:1:47539638><>" connected No... (2 Replies)
Discussion started by: spinner0205
2 Replies

5. Shell Programming and Scripting

rsync is not correctly working

We are using Red Hat linux system. I am transferring my rman backup files to another server. Here is the command i am using to transfer the files. /usr/bin/rsync -avpP --delete /xyz/xyz/ 99.99.999.99::db110bkp Here is the rsync version. >rsync --version rsync version 3.0.6 ... (1 Reply)
Discussion started by: govindts
1 Replies

6. Shell Programming and Scripting

Find cmd not working correctly in script

I am trying to copy 2 types of files so I can archive them. I tested with a set of commands: touch -t $(date -d "-60 day" +%Y%m%d) WORKDIR/REF find TARGETDIR/ -type f -maxdepth 1 -iname \*.out\* -or -iname \*.log\* ! -newer WORKDIR/REF -exec ls -l {} \; This correctly lists any files in the... (2 Replies)
Discussion started by: prismtx
2 Replies

7. UNIX for Dummies Questions & Answers

grep -A switch not working correctly with -m

egrep -A 7 -m 2 -h 'Date:|Time:' *.html this is showing only 2 line after the context of the 2nd found match. Is this a bug in grep? egrep -A 7 -m 2 -h 'Time:' *.html - this works correctly (2 Replies)
Discussion started by: zer0
2 Replies

8. Shell Programming and Scripting

Variable not working correctly.

Hi, I have a script where I am trying to set a local variable using the following, MYVAR="$NAME"_"$NAME2".txt where say, NAME = one NAME2 = two so I want the output one_two.txt but what I am getting is, two.txt basically the $NAME2 is overwriting, what am I doing wrong? ... (3 Replies)
Discussion started by: walsh_j
3 Replies

9. Shell Programming and Scripting

if not working correctly

Anyone have an idea why this if statement does not work correctly? "test2.sh" 18 lines, 386 characters #!/usr/bin/sh WARNING=80 CRITICAL=95 check_it() { if ] || ];then echo "YES ] || ]" else echo "NO ] || ]" fi } check_it 80.1 check_it 81.1 (3 Replies)
Discussion started by: 2dumb
3 Replies

10. UNIX for Dummies Questions & Answers

Script not working correctly

I have a simple script that I want to run every 30 minutes but only when I execute it. I don't want it to be a crontab job. so i have for example date ls -l who sleep 1800 The first time it executes correctly but after the first time it nevers execute back again. It should execute after... (2 Replies)
Discussion started by: elchalateco
2 Replies
Login or Register to Ask a Question