Useful POSIX Recipes
Last updated on 2015-04-25 12:09:48 -0300
1. Spawn Process (a.k.a. fork-exec)
http://en.wikipedia.org/wiki/Fork_(system_call)
#include <unistd.h> void spawn(char *const argv[]) { pid_t pid; int status; pid = fork(); if (pid > 0) { /* fork() succeeded. */ waitpid(pid, &status, 0); } else if (pid == 0) { /* Child process. */ execvp(argv[0], argv); } }
2. Read Output of Child Process
http://stackoverflow.com/questions/2605130/redirecting-exec-output-to-a-buffer-or-file
int pipefd[2]; pipe(pipefd); if (fork() == 0) { close(pipefd[0]); /* close reading end in the child */ dup2(pipefd[1], 1); /* send stdout to the pipe */ dup2(pipefd[1], 2); /* send stderr to the pipe */ close(pipefd[1]); /* this descriptor is no longer needed */ exec(...); } else { char buffer[1024]; close(pipefd[1]); /* close the write end of the pipe in the parent */ while (read(pipefd[0], buffer, sizeof(buffer)) != 0) { ... } }
3. List Directory
#include <stdio.h> #include <dirent.h> int ls(const char *path) { DIR *dp; struct dirent *ep; if(!(dp = opendir(path))) return -1; while ((ep = readdir(dp))) puts(ep->d_name); closedir(dp); return 0; }