例1:
#include <stdio.h> #include <sys/types.h> #include <unistd.h> void main() { pid_t pid; //此时仅有一个进程 pid = fork(); //此时已经有两个进程在同时运行 if (pid < 0) printf("error in fork!"); else if (pid == 0) printf("I am the child process, ID is %d\n", getpid()); else printf("I am the parent process, ID is %d\n", getpid()); }运行结果: 输出
#include <stdio.h> #include <unistd.h> int main(void) { pid_t pid; int count = 0; pid = fork(); count++; printf("count = %d\n", count); return 0; }运行结果: 输出
五、vfork()函数
pid_t vfork(void); //功能:创建子进程
fork PK vfork
区别:1. fork :子进程拷贝父进程的数据段
vfork :子进程与父进程共享数据段
2. fork : 父、子进程的执行次序不确定
vfork : 子进程先运行,父进程后运行
六、exec 函数族
exec用被执行的程序替换调用它的程序。
区别:fork创建一个新的进程,产生一个新的PID。
exec启动一个新程序,替换原有的进程,因此进程的PID不会改变。
6.1 execl
int execl(const char *path, const char *arg1, ...)
参数:path : 被执行程序名(含完整路径)。
arg1 -- argn : 被执行程序所需的命令行参数,含程序名。已空指针(NULL)结束。
例:
#include <stdio.h> #include <unistd.h> void main() { execl("/bin/ls", "ls", "-al", "/etc/passwd", (char*)0); }6.2 execlp
#include <stdio.h> #include <unistd.h> void main() { execlp("ls", "ls", "-al", "/etc/passwd", (char*)0); }6.3 execv
#include <stdio.h> #include <unistd.h> void main() { char* argv[] = {"ls", "-al", "/etc/passwd", (char*)0}; execv("ls", argv); }七、 system 函数
#include <stdio.h> #include <unistd.h> void main() { system("ls -al /etc/passwd"); }八 进程等待
#include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> void main() { pid_t pc,pr; pc = fork(); if (pc == 0) { printf("This is child process with pid of %d\n", getpid()); sleep(10); } else if (pc > 0) { pr = wait(NULL); printf("I catched a child process with pid of %d\n", pr); } exit(0); }