Sponsored Content
Top Forums Programming When I am writing my own interpreter... Post 302142009 by Legend986 on Wednesday 24th of October 2007 12:57:38 AM
Old 10-24-2007
Thanks to everyone here... I am slowly able to realize the shell... I'm actually stuck at piping... I am able to handle a single pipe but how do I solve the problem of multiple pipes? I know it can be solved using recursion but some pseudo algorithm will be excellent... I don't understand how to actually use recursion here... I'm currently doing something like a parent creates two children and the first one executes one command and pipes it onto the second child which displays the output...

And when I used valgrind, to my surprise I found 15 memory leaks from the piping function that I wrote and I don't understand what could've gone wrong... My pseudo code looks something like this:

Code:
	
	int fd[2]; /* provide file descriptor pointer array for pipe */
	pid_t pid1, pid2; /* process ids for each child */
	/* create pipe and check for an error */
	/* apply fork and check for error */
	    /* processing for child */
	    close (fd[1]); /* close output end, leaving input open */
	    /* set standard input to pipe */
	    if (fd[0] != STDIN_FILENO)
	    {
		if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)
		{
		    perror("dup2 error for standard input");
		    exit(1);
		}
		close(fd[0]);
	    }
	   execlp the second function
	    //First child finished
	
	else
	{
	    /* processing for parent */
	    /* spawn second process */
	   /* apply fork again for second child*/
	  /* processing for child */
		
		close (fd[0]);
		/* set standard output to pipe */
		if (fd[1] != STDOUT_FILENO)
		{
		    if (dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO)
		    {
			perror("dup2 error for standard output");
			exit(1);
		    }
		    close(fd[1]); /* not needed after dup2 */
		}
		
		execlp the first function
		/* print to the pipe, now standard output */
	    }
	    else
	    {
		/* processing continues for parent */
		close(fd[0]);
		close(fd[1]);
		waitpid (pid1, NULL, 0); /* wait for first child to finish */
		waitpid (pid2, NULL, 0); /* wait for second child to finish */
	   }
	}

Am I doing something wrong?

Last edited by Legend986; 10-24-2007 at 02:45 AM..
 

7 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

an command interpreter

if somebody can help me pls. i need the source code for a shell which compiles C or java programs. i need a very short and simple one, just for the compiling part, in UNIX Respect (4 Replies)
Discussion started by: zlatan005
4 Replies

2. UNIX for Dummies Questions & Answers

m4 as script interpreter

#!/usr/bin/m4 when running m4 scripts with "#!/usr/bin/m4" they are executed properly, but "#!/usr/bin/m4" is printed out - how to avoid it? Thanks in advance. (5 Replies)
Discussion started by: Action
5 Replies

3. Programming

Java Interpreter

Hello guys - do you have any sample program implementing UNIX commands in an interpreter with Java? I can look up the simple ones such "ls" etc and then write my own commands. I would appreciate it. (2 Replies)
Discussion started by: cmontr
2 Replies

4. Shell Programming and Scripting

Multiple interpreter declarations

Hi, I am writing a shell script that connects to a remote server and performs some tasks on the server and exits. Since i am using a ssh connection, i am using a "expect" utility to supply the password automatically (which is present within the script). In order to use this utility, i need to... (3 Replies)
Discussion started by: sunrexstar
3 Replies

5. Shell Programming and Scripting

Bad Interpreter

Hi. My name is Caleb (a.k.a RagingNinja) form the whited00r forums. (Whited00r makes custom firmware for iOS devices). I have been learning and creating simple shells scripts. I have been recently using VIM for Windows or using VirtualBox to run the UBUNTU OS within VirtualBox to create my shell... (2 Replies)
Discussion started by: RagingNinja
2 Replies

6. Linux

interpreter files

Can you explain me what is ment by interpreter files ?? Why and how they are used?? (1 Reply)
Discussion started by: kkalyan
1 Replies

7. Shell Programming and Scripting

Dynamically choosing the interpreter

Hi, Is it possible to choose the inerpreter conditionally. For example, if whereis bash returns /usr/bin/bash then i need to choose #!/usr/bin/bash else i need to use #!/usr/bin/sh. Is it possible to achieve in a shell script? Thanks (1 Reply)
Discussion started by: pandeesh
1 Replies
binfmtgcj(1)							     binfmt_C							      binfmtgcj(1)

NAME
binfmtgcj-interpreter - binfmt_misc gcj handler SYNOPSIS
binfmtgcj-interpreter GCJ-java-source-file-name [command-line opions ...] DESCRIPTION
binfmtgcj-interpreter compiles a Java source file specified on the command-line using the GCJ compiler, and executes the resulting file. It is designed to be used as a handler for binfmt_misc handler, which is a system used in Linux for handling arbitrary files as executa- bles. The command-line options are passed on to the compiled binary. FILE MAGIC
There is a requirement for C source files to have the magic characters //BINFMTGCJ: at the beginning of the file. That line also is used to specify the additional command-line options for C compiler. ENVIRONMENT
GCJ The compiler used. The default is to use gcj BINFMTCTMPDIR Temporary directory used for binary and execution. Falls back to $TMPDIR $TEMPDIR or /tmp BINFMTC_DEBUG enables debug output if set. BINFMTC_GCJ_OPTS Additional GCJ options. Use BINFMTC_DEBUG to verify the options being passed on to gcc. The default is -O2 -Wall AUTHOR
Junichi Uekawa (dancer@debian.org) Upstream page is available at http://www.netfort.gr.jp/~dancer/software/ SEE ALSO
binfmtasm-interpreter(1), binfmtc-interpreter(1), binfmtcxx-interpreter(1), binfmtf-interpreter(1), binfmtf95-interpreter(1) binfmt_misc Dancer 2005 May 3 binfmtgcj(1)
All times are GMT -4. The time now is 09:49 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy