zoukankan      html  css  js  c++  java
  • 多进程使用

    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()函数详解

  • 相关阅读:
    存储过程为参数NULL时的处理方法
    查询数据占比
    ROW_NUMBER() OVER()函数用法;(分组,排序),partition by
    存储过程 set 和 select 对变量赋值的区别 (转自Theo)
    对布尔值取反,使用 ~
    创建存储过程
    JavaScript验证密码强度
    一些简单的JavaScript的方法
    递归方式实现树的展示形式
    ASP.NET验证控件详解
  • 原文地址:https://www.cnblogs.com/Younger-Zhang/p/15323107.html
Copyright © 2011-2022 走看看