zoukankan      html  css  js  c++  java
  • 进程创建

    进程是计算机运行的基本单位。而产生一个进程有多种方式,例如fork()函数、system函数。以下着重介绍上面两个。

    1.fork()

    fork()函数是以父进程位蓝本复制一个进程,该进程的进程id号与父进程的进程id号是不相同的。其函数原型如下:

    pid_t fork(void);

    类型pid_t是一个预定义类型,定义为unsigned int(系统头文件预定义类型,包含头文件就行了)。当调用fork()成功时,其返回值为进程的id(注意:父进程中返回的是子进程的id,而子进程中返回的是0),如果调用失败,其返回值为-1。

    例子:

    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<iostream>
    using namespace std;
    int main()
    {
            pid_t pid;
            pid = fork();
            if(pid == -1)
                    cout << "fork false!" << endl;
            else if(pid == 0)
                    cout << "child process" << endl << "pid:" << pid << " getpid:" << getpid() << " getppid:" << getppid() << endl;
            else
                    cout << "parent process" << endl << "pid:" << pid << " getpid:" << getpid() << " getppid:" << getppid() << endl;
            return 0;
    }    

    其中:getpid()函数为获取当前进程的进程id,getppid()函数为获取当前进程的父进程的进程id。该程序的运行结果为:

    parent process
    pid:28780 getpid:28779 getppid:17250
    child process
    pid:0 getpid:28780 getppid:28779

    可以看出fork()出来的子进程的父进程id号是执行fork()函数的进程id号

    2.system()方式

    system()函数调用shell的外部命令在当前进程中开始另一个进程。当执行成功时返回的是进程的状态值,失败时返回-1,若传入的外部命令无法执行,则返回127

    例子:

    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<iostream>
    using namespace std;
    int main()
    {
            int ret;
    
            cout << "the current process id is " << getpid() << endl;
            ret = system("ping 127.0.0.1 -c 2");
            cout << "the system command ret is " << ret << endl;
            return 0;
    }

    -c加数字代表ping几次

    拓展:

    在linux系统中,所有的进程都是有父子或者堂兄关系(一个进程fork多个进程)的,出了初始进程init,没有哪个进程与其他进程完全独立。系统中每个进程都有一个父进程,新的进程通常是从一个原油的进程进行复制或克隆的。在linux下可以利用pstree命令来查看进程树,很容易发现init进程是所有进程的祖先。

  • 相关阅读:
    拦截器getmodel方法什么时候被调用(没搞懂有什么鸟用,自己搭的项目中用到了这个)
    Convention插件的使用(会涉及content目录,jsp必须放入这个下面才能映射成功基于注解的配置)
    Spring组件扫描<context:component-scan/>使用详解
    Eclipse从数据库逆向生成Hibernate带注解的实体类
    HibernateTool的安装和使用(Eclipse中)
    将一字符串首字母转大写
    二分(折半)查找算法
    按位与运算符
    注解及自定义注解
    根据前序遍历和中序遍历得出后序遍历
  • 原文地址:https://www.cnblogs.com/cansun/p/11858710.html
Copyright © 2011-2022 走看看