Re: [OT] 'volatile' in userspace

Jeff Dike
2006-07-10T18:54:36Z

On Mon, Jul 10, 2006 at 10:00:37AM -0700, Joshua Hudson wrote:
> Yes, I use vfork. So far, the only way I have found for the parent to
> know whether or not the child's exec() failed is this way:

What I do in UML is make a pipe between the parent and child, set it
CLOEXEC, and write a byte down it if the exec fails.

The parent reads it - if it gets no bytes, the exec succeeded, if it
gets one byte, it failed.

child -
execvp(argv[0], argv);
errval = errno;
write(data->fd, &errval, sizeof(errval));

parent -
socketpair(AF_UNIX, SOCK_STREAM, 0, fds);
fcntl(fds[1], F_SETFD, flag);
pid = clone(child, NULL, SIGCHLD, NULL);
if(pid < 0){
...
}

close(fds[1]);

/* Read the errno value from the child, if the exec failed, or get 0 if
* the exec succeeded because the pipe fd was set as close-on-exec.
*/
n = read(fds[0], &ret, sizeof(ret));
if (n < 0) {
} else if(n != 0){
/* exec failed */
} else {
/* exec succeeded */
}

Jeff