什么是进程
进程是系统中正在运行的一个程序,程序一旦运行就是进程。当你运行一个程序,你就启动了一个进程。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信。
多进程就是指计算机同时执行多个进程
Linux中一个进程在内存中有三部分数据,分别是“代码段”、“堆栈段”和“数据段”,子进程和父进程中“代码段”是相同的,“堆栈段”和“数据段”是不同的
”代码段”存放了程序代码,“堆栈段”存放的就是程序的返回地址、程序的参数以及程序的局部变量,“数据段”则存放程序的全局变量,常数以及动态数据分配的数据空间(比如用new函数分配的空间)。
Linux下多进程编程
在Linux系统中创建进程有两种方式:
一、是由操作系统创建
二、是由父进程创建进程(通常为子进程)。系统调用函数fork()是创建一个新进程的唯一方式(也会有其他方式,但实际上还是调用fork()函数,如:vfork() )
fork()函数详解
#include <unistd.h>
pid_t fork(void);
fork()函数是一个非常特殊的函数
普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。
演示fork()函数
#include<stdio.h>
#include <unistd.h>
// 父进程要执行的函数
int fatherfunc()
{
printf("这是父进程所执行的函数\n");
return 0;
}
// 子进程要执行的函数
int childfunc()
{
printf("这是子进程执行的函数\n");
return 0;
}
int main()
{
printf("程序开始\n");
pid_t ii = fork();
if ( ii == 0 ) { childfunc(); sleep(1); }
if ( ii > 0 ) { fatherfunc(); sleep(3); }
printf("程序结束\n");
return 0;
}
运行结果:
程序执行过程解释:
程序在执行fork()函数后会多出一个子进程,子进程执行的内容是fork()函数以后的内容,父进程运行的也是fork()函数后的内容。
先运行父进程,因为在父进程中fork()函数的返回值不为零,是子进程的编号,所以执行fatherfunc()函数,睡眠一秒
接下来运行子进程,子进程中fork()函数的返回值为零,所以执行childfunc()函数,睡眠三秒
父进程在睡眠一秒后继续执行,屏幕显示出第一条程序结束
子进程在睡眠三秒后继续执行,屏幕显示出第二条程序结束
父子进程共享fork之前打开的文件描述符,当有子进程产生时,文件描述符的引用计数加1;
由于水平有限,本博客难免有不足,恳请各位大佬不吝赐教!
如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!