Linux下多进程编程

什么是进程

进程是系统中正在运行的一个程序,程序一旦运行就是进程。当你运行一个程序,你就启动了一个进程。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信。
多进程就是指计算机同时执行多个进程
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;
}

运行结果:
多进程1
程序执行过程解释:
程序在执行fork()函数后会多出一个子进程,子进程执行的内容是fork()函数以后的内容,父进程运行的也是fork()函数后的内容。
先运行父进程,因为在父进程中fork()函数的返回值不为零,是子进程的编号,所以执行fatherfunc()函数,睡眠一秒
接下来运行子进程,子进程中fork()函数的返回值为零,所以执行childfunc()函数,睡眠三秒
父进程在睡眠一秒后继续执行,屏幕显示出第一条程序结束
子进程在睡眠三秒后继续执行,屏幕显示出第二条程序结束

父子进程共享fork之前打开的文件描述符,当有子进程产生时,文件描述符的引用计数加1;

由于水平有限,本博客难免有不足,恳请各位大佬不吝赐教!
如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值