1.创建多进程
一般的步骤是这样的:
#include <unistd.h> //C 和 C++ 程序设计语言中提供对POSIX 操作系统API 的访问功能的标头档的名称。是Unix Standard的缩写。
pid_t fpid; //fork函数返回值
fpid = fork(); //fork函数就是创建新的进程,而且新的子进程在这一步就开始了,而不是下一步
if( fpid < 0){ //错误}
else if( fpid == 0 ) { //子进程的fork函数返回值为0,但是不代表子进程的进程id为0}
else { //父进程的fork函数返回子进程id}
2.获取进程id函数:getpid()
3.wait()函数
功能:阻塞当前进程直到子进程完成
用法:
int status = 0;
wait(&status);
if( WIFEXITED(status) != 0) {//取出status值,正常结束获得非零值}
status用来存放子进程退出时的状态值。
假如没有wait():
#include <iostream> #include <unistd.h> #include <sys/wait.h> using namespace std; int main() { pid_t fpid; for(int i=0; i<2; i++) { fpid = fork(); if(fpid < 0) { cout << "Error: fork()" << endl; return 1; } else if(fpid == 0) { cout << "This is child process, pid = " << getpid() << endl; } else { cout << "This is parent process, pid = " << getpid() << endl; int status = 0; wait(&status); } } return 0; }
结果输出:
This is parent process, pid = 12394
This is parent process, pid = 12394
This is child process, pid = 12395
This is child process, pid = 12396
This is parent process, pid = 12395
This is child process, pid = 12397
表明父进程和子进程的执行顺序是不定的。
加入存在wait()函数:
#include <iostream> #include <unistd.h> #include <sys/wait.h> using namespace std; int main() { pid_t fpid; for(int i=0; i<2; i++) { fpid = fork(); if(fpid < 0) { cout << "Error: fork()" << endl; return 1; } else if(fpid == 0) { cout << "This is child process, pid = " << getpid() << endl; } else { cout << "This is parent process, pid = " << getpid() << endl; int status = 0; wait(&status); } } return 0; }
输出结果:
This is parent process, pid = 12464
This is child process, pid = 12465
This is parent process, pid = 12465
This is child process, pid = 12466
This is parent process, pid = 12464
This is child process, pid = 12467
表明父进程执行完cout信息之后,发生了阻塞并等待子进程执行结束。
这就是wait()函数的简单用法。
4.exit()进程退出
fork()执行到什么结束呢?当进程退出的时候自然结束,还可以使用exit()函数显式退出。
用法:
#include <libstd.h>
int status = 0;
exit(status);
在子进程(if fpid == 0){}里面的cout前面添加exit()退出,结果输出:
This is parent process, pid = 17127
This is parent process, pid = 17127
因为子进程被强制退出了,所以没有子进程的输出。
参考: