多进程使用

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

因为子进程被强制退出了,所以没有子进程的输出。

参考:

linux中fork()函数详解

原文地址:https://www.cnblogs.com/Younger-Zhang/p/15323107.html