wonnie
wonnie

Reputation: 479

Running a shell command in a c program

I want to run a shell command in my c program. But the thing is that i don't want to make my program wait until the command performed. No need to read the shell command's output (it returns no data anyway) So basically, is that possible?

Upvotes: 10

Views: 14920

Answers (4)

Jens
Jens

Reputation: 72619

What about simply amping the command with system ("command &")?

Upvotes: 2

rlc
rlc

Reputation: 2857

Sure, 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 takes the arguments you would normally give to the shell.

Your code could 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's 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 quoted from the POSIX standard (SUSv4) will handle that:

static void
handle_sigchld(int signum, siginfo_t *sinfo, void *unused)
{
    int status;

    /*
     * Obtain status information for the child which
     * caused the SIGCHLD signal and write its exit code
     * to stdout.
    */
    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);
    }
}

Upvotes: 6

JackMc
JackMc

Reputation: 378

Try code like this:

#include <stdlib.h>
#include <unistd.h>
int main(int argc, char ** argv)
{
     if (!fork())
     {
         execv("ls", {"myDir"}); /* Your command with arguments instead of ls. */
     }
}

Upvotes: 1

Stefano Borini
Stefano Borini

Reputation: 143755

fork() and system() is what you need

Upvotes: 6

Related Questions