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..
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)
#!/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)
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)
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)
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)
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
LEARN ABOUT MOJAVE
tcl_getopenfile
Tcl_GetOpenFile(3) Tcl Library Procedures Tcl_GetOpenFile(3)__________________________________________________________________________________________________________________________________________________NAME
Tcl_GetOpenFile - Return a FILE* for a channel registered in the given interpreter (Unix only)
SYNOPSIS
#include <tcl.h>
int
Tcl_GetOpenFile(interp, chanID, write, checkUsage, filePtr)
ARGUMENTS
Tcl_Interp *interp (in) Tcl interpreter from which file handle is to be obtained.
const char *chanID (in) String identifying channel, such as stdin or file4.
int write (in) Non-zero means the file will be used for writing, zero means it will be used for reading.
int checkUsage (in) If non-zero, then an error will be generated if the file was not opened for the access indicated by
write.
ClientData *filePtr (out) Points to word in which to store pointer to FILE structure for the file given by chanID.
_________________________________________________________________DESCRIPTION
Tcl_GetOpenFile takes as argument a file identifier of the form returned by the open command and returns at *filePtr a pointer to the FILE
structure for the file. The write argument indicates whether the FILE pointer will be used for reading or writing. In some cases, such as
a channel that connects to a pipeline of subprocesses, different FILE pointers will be returned for reading and writing. Tcl_GetOpenFile
normally returns TCL_OK. If an error occurs in Tcl_GetOpenFile (e.g. chanID did not make any sense or checkUsage was set and the file was
not opened for the access specified by write) then TCL_ERROR is returned and the interpreter's result will contain an error message. In
the current implementation checkUsage is ignored and consistency checks are always performed.
Note that this interface is only supported on the Unix platform.
KEYWORDS
channel, file handle, permissions, pipeline, read, write
Tcl 8.0 Tcl_GetOpenFile(3)