Of course, just fork and exec : use fork to create a new process, and in the child process use exec to start the shell with your command. execv accepts the arguments that you usually pass to the shell.
Your code might look like this:
pid_t child_pid = fork(); if (child_pid == 0) { // in child /* set up arguments */ // launch here execv("/bin/sh", args); // if you ever get here, there been an error - handle it } else if (child_pid < 0) { // handle error }
the child process will send a SIGCHLD signal when it dies. This code, specified in the POSIX standard (SUSv4), will handle the following:
static void handle_sigchld(int signum, siginfo_t *sinfo, void *unused) { int status; if (sinfo->si_code != CLD_EXITED) { static char msg[] = "wrong si_code\n"; write(2, msg, sizeof msg - 1); } else if (waitpid(sinfo->si_pid, &status, 0) == -1) { static char msg[] = "waitpid() failed\n"; write(2, msg, sizeof msg - 1); } else if (!WIFEXITED(status)) { static char msg[] = "WIFEXITED was false\n"; write(2, msg, sizeof msg - 1); } else { int code = WEXITSTATUS(status); char buf[2]; buf[0] = '0' + code; buf[1] = '\n'; write(1, buf, 2); } }
rlc
source share