首页 > 技术文章 > 进程创建

cansun 2019-11-14 17:15 原文

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

推荐阅读