[TUHS] Shell builtin exec
Warren Toomey
wkt at tuhs.org
Wed Aug 21 08:00:33 AEST 2019
On Tue, Aug 20, 2019 at 02:10:55PM -0700, Adam Thornton wrote:
> This is probably the place to ask:
> I understand why the shell builtin "exec" is the same as the syscall
> exec() in the sense of "replace this process with that one." But why
> is it also the way to redirect filehandles in the current shell? (That
> is, why isn't the redirection named something else?)
exec() doesn't do anything with file handles; it simply replaces the
executable code in the current process. Here's the pseudo-code for a
shell where redirection is done.
int pid; /* Holds the process-id of the child */
switch (pid = fork()) /* Call fork, and test what it returns */
{
case -1: printf("The fork failed\n"); return (-1);
case 0: /* The child is given a value of 0 from fork() */
/* Do special things like closing files etc. */
if (redirection required) {
close my standard output;
open the named output file as my standard output;
}
/* Replace ourselves with the real child */
/* Call execvp */
execlp(command, arg1, arg2, ..., NULL);
exit(1); /* Exec failed, indicate error */
default: /* The parent receives the new process-id from fork() */
wait(); /* Wait for child to exit */
}
So the child shell itself does the redirection after the fork(), but before
it replaces itself with the new executable code.
Cheers, Warren
More information about the TUHS
mailing list