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