进程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 选项、系统调用失败等...