原文链接:fork函数 创建多进程
fork多进程:<unistd.h>
<unistd.h>
linux在<unistd.h>提供了许多系统调用函数,包括提供了fork函数创建父子进程,实现多进程.以及其他必要的函数.
1 2 3 4 5 6 7 8 9
| fork():创建一个子进程的副本。 exec*():用于在当前进程上执行一个新的程序。exec是一个函数集,有多个函数 wait():等待子进程结束。 getpid():获取当前进程的进程ID。 getppid():获取当前进程的父进程ID。 chdir():改变当前工作目录。 gethostname():获取主机名。 sysconf():获取系统配置信息。
|
fork函数
fork后子进程会完全复制父进程的数据,包括文件描述符列表,因此能够支持后面的管道通信.
1 2
| pid_t fork() return -1(失败) 0(子进程返回值) >0(父进程中返回子进程的pid)
|
调用fork()时, 会生成一个当前程序副本,由另一个子进程执行,父子进程都从fork()处继续执行
但是 fork() 能够返回不同的值:
父进程的fork返回id>0,是子进程的pid,
子进程的fork返回0, 子进程可以getpid()和getppid()获取父子的pid.
当出错时返回-1 :此时子进程不会被创建.
实例:fork和exec实现创建多个子进程
parent.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include <iostream> #include <unistd.h> #include <sys/wait> #include <filesystem> #include <vector> using namespace std;
int child_process(const char* program_name,char** args){ pid_t cpid=fork(); if(cpid==-1){ perror("fork"); exit(EXIT_FAILURE); }else if(cpid>0){ return cpid; }else{ execve(program_name,args,nullptr); perror("execve"); exit(EXIT_FAILURE); } }
int main() { char program_name[]="child.cpp"; char* args[]={program_name,nullptr}; vector<pid_t> childs(3); if(!exists(program_name)){ perror("exists"); exit(EXIT_FAILURE); } for(int i=0;i<3;i++){ childs[i]=child_process(program_name,args); } pid_t cpid; while((cpid=wait())>0){ cout<<"child."<<cpid<<"terminated\n"; } return 0; }
|
child.cpp
1 2 3 4 5 6 7 8 9 10 11
| #include <iostream> #include <unistd.h> using namespace std;
int main(){ for(int i=0;i<5;i++){ cout<<"child."<<getpid()<<"run"<<i<<"\n"; sleep(1); } exit(EXIT_SUCCESS); }
|