0%

fork函数 创建多进程

原文链接:fork函数 创建多进程

fork多进程:<unistd.h>

<unistd.h>

linux在<unistd.h>提供了许多系统调用函数,包括提供了fork函数创建父子进程,实现多进程.以及其他必要的函数.

1
2
3
4
5
6
7
8
9
//<unistd.h>:
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);
}