tholm@uvicctr.UUCP (Terrence W. Holm) (10/26/88)
EFTH MINIX report #52 - October 1988 - system(3) fix The MINIX 1.3 system(3) uses an exit() if the fork() fails, and does not ignore sigint/sigquit in the waiting process. These problems can cause strange behavior, see the recently posted CKermit binary for an example. The following should fix these problems. ---------------------------------------------------------- echo x - system.3 gres '^X' '' > system.3 << '/' XSUBROUTINES X system(3) - execute a shell command line X XINVOCATION X int system( command ) X char *command; X XEXPLANATION X A process is created to execute <command>, using the Bourne X shell sh(1). The invoker waits with SIGINT and SIGQUIT ignored, X until the sub-shell terminates. X XRESULTS X o/w : Result from wait(2). X 0x7f00 : Insufficient memory to fork. X -1 : An unexpected signal occurred. X XREFERENCES X sh(1), signal(2), wait(2), popen(3) / echo x - system.c gres '^X' '' > system.c << '/' X/* system.c X * X * Changed to return() on fork failure, added signal() X * calls. Terrence W. Holm Oct. 1988 X */ X X#include <stdio.h> X#include <signal.h> X Xsystem(cmd) Xchar *cmd; X{ X int retstat, procid, waitstat; X void (*sigint)(), (*sigquit)(); X X if ( (procid = fork()) == 0) { X /* Child does an exec of the command. */ X execl( "/bin/sh", "sh", "-c", cmd, 0 ); X exit( 127 ); X } X X /* Check to see if fork failed. */ X if (procid < 0) return( 127 << 8 ); X X sigint = signal( SIGINT, SIG_IGN ); X sigquit = signal( SIGQUIT, SIG_IGN ); X X while ( (waitstat = wait(&retstat)) != procid && waitstat != -1 ) ; X if (waitstat == -1) retstat = -1; X X signal( SIGINT, sigint ); X signal( SIGQUIT, sigquit ); X X return(retstat); X} / ---------------------------------------------------------- Terrence W. Holm uw-beaver!uvicctr!tholm