进程API

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>

int main(int argc, char *argv[]) {
    printf("hello world (pid:%d)\n", (int) getpid());
    int rc = fork();
    if (rc < 0) { // fork failed; exit
        fprintf(stderr, "fork failed\n");
        exit(1);
    } else if (rc == 0) { // child (new process)
//        printf("hello, I am child (pid:%d)\n", (int) getpid());
        close(STDOUT_FILENO);
        open("./fork.output",O_CREAT|O_WRONLY|O_TRUNC|S_IRWXU);
        char *myargs[3];
        myargs[0]=strdup("wc");
        myargs[1]=strdup("fork.c");
        myargs[2]=NULL;
        execvp(myargs[0],myargs);
        printf("this shouldn't print out");
    } else { // parent goes down this path (main)
        int wc = wait(NULL);
        printf("hello, I am parent of %d (wc:%d) (pid:%d)\n", rc,wc, (int) getpid());
    }
    return 0;
}
  • fork() 创建一个当前进程的分身,但是从fork处开始执行,fork成功后父进程rc值为子进程的 pid,而子进程中 rc 为零
  • exec() 创建一个当前进程的分身,从传递进来的可执行程序中加载代码和静态数据,并用它覆写自己的代码段(以及静态数据),堆、栈及其他内存空间也会被重新初始化。exec执行失败才会有返回。
  • wait() 阻塞父进程,等待子进程运行完成,在某些情况下wait会失效,比如信号中断 (EINTR)、使用了 waitpid() 并传递了 WNOHANG 选项、系统调用失败等...