• 进程创建


    进程是计算机运行的基本单位。而产生一个进程有多种方式,例如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进程是所有进程的祖先。

  • 相关阅读:
    安卓清理缓存怎么做(未完)
    【转】来讨论下 Android 面试该问什么?
    解决app安装成功后,直接点击“打开”再按home返回,再次打开app会重新启动的问题
    Android切换横竖屏不销毁前台Activity,也不影响后台Activity
    Android布局:宽度适应的横向跟随,防止挤掉重要视图
    Android上的Badge,快速实现给应用添加角标
    博客上传图片存储解决
    ViewComponent组件在框架中使用
    Git日常使用命令
    js中的preventDefault与stopPropagation详解
  • 原文地址:https://www.cnblogs.com/cansun/p/11858710.html
Copyright © 2020-2023  润新知