Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!sdd.hp.com!spool.mu.edu!uunet!bria!mike From: mike@bria Newsgroups: comp.unix.programmer Subject: Re: Detecting exec(2) failing after performing fork(2)? Message-ID: <493@bria> Date: 1 Mar 91 21:20:29 GMT References: Reply-To: uunet!bria!mike Organization: MGI Group International, Los Angeles, CA Lines: 70 Followup-To: Keywords: In an article, login.dkuug.dk!shj (Stig Jacobsen) writes: |When my application desires to spawn off a background process, |I use something roughly like this: [ example deleted ] |This is fine if the exec..() call goes well. However, if the exec() |call fails, the error is not reported back to the parent. I get |a SIGCLD of course, but what I'd really like is that my spawn() |function just returns an error, if the exec() call fails. So far |the best solution that I've come up with is, | |int spawn(char *path, ...) |{ | | if (access(path, R_OK|X_OK) != 0) | return -1; | if (fork() == 0) | execlp(path, NULL); | |} | |But this is not an elegant solution, nor is it entirely safe: |If someone unlinks 'path' between the access() and the exec() |call (not _that_ unlikely if the system is heavily loaded), |I won't detect the error anyways! | |So - what does everybody else do? Am I overseeing something |totally obvious? Some time ago, I wrote a spawn function (but then I got religion, and only use fork/exec explicitly :-) The only caveat is if the spawned program returns an exit status of 255, it will look like the spawn failed (this was never a big issue for me, so I left it). Here goes: #include main(argc,argv) int argc; char *argv[]; { printf("spawn returned %d\n",spawn(argv[1],&argv[1])); return(0); } spawn(path,argv) char *path, *argv[]; { int ret, xit; if ( (ret = fork()) > 0 ) { if ( wait(&xit) == -1 ) return(-1); } else if ( ret == 0 ) { if ( execvp(path,argv) == -1 ) exit(-1); } else return(-1); return(xit >> 8); } -- Michael Stefanik, MGI Inc., Los Angeles| Opinions stated are not even my own. Title of the week: Systems Engineer | UUCP: ...!uunet!bria!mike ------------------------------------------------------------------------------- Remember folks: If you can't flame MS-DOS, then what _can_ you flame?