进程控制块

在Linux中,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,它通常包含如下信息:

  • 进程id。系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负整数。
  • 进程的状态,有运行、挂起、停止、僵尸等状态。
  • 进程切换时需要保存和恢复的一些CPU寄存器。
  • 描述虚拟地址空间的信息。
  • 描述控制终端的信息。
  • 当前工作目录(Current Working Directory)。
  • umask掩码。
  • 文件描述符表,包含很多指向file结构体的指针。
  • 和信号相关的信息。
  • 用户id和组id。
  • 控制终端、Session和进程组。
  • 进程可以使用的资源上限(Resource Limit)。

fork和exec

fork的作用是根据一个现有的进程复制出一个新进程,原来的进程称为父进程(Parent Process),新进程称为子进程(Child Process)。

系统中同时运行着很多进程,这些进程都是从最初只有一个进程开始一个一个复制出来的。在Shell下输入命令可以运行一个程序,是因为Shell进程在读取用户输入的命令之后会调用fork复制出一个新的Shell进程,然后新的Shell进程调用exec执行新的程序。

一个程序可以多次加载到内存,成为同时运行的多个进程,例如可以同时开多个终端窗口运行/bin/bash,另一方面,一个进程在调用exec前后也可以分别执行两个不同的程序,例如在Shell提示符下输入命令ls,首先fork创建子进程,这时子进程仍在执行/bin/bash程序,然后子进程调用exec执行新的程序/bin/ls,如下图所示。

fork函数

fork函数的声明如下:

pid_t fork(void);

当fork复制进程失败时,会返回-1;当复制进程成功时,由于复制出来的进程只执行fork函数之后的代码。虽然父进程和子进程都会执行后续的代码,但可以通过fork的返回值加以区分,一个简单的示例如下:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main(void)
{pid_t pid;char *message;int n;pid = fork();if (pid < 0) {perror("fork failed");exit(1);}if (pid == 0) {message = "This is the child\n";n = 6;} else {message = "This is the parent\n";n = 3;}for(; n > 0; n--) {printf(message);sleep(1);}return 0;
}

fork对父进程返回子进程的ID,对子进程返回0,因此可以通过返回值来区分是父进程还是子进程。

这样设计是有道理的,虽然子进程无法通过返回值获取进程ID,但可以通过getpid函数得到自己的进程id,也可以调用getppid函数得到父进程的id。在父进程中用getpid可以得到自己的进程id,然而要想得到子进程的id,只有将fork的返回值记录下来,别无它法。

根据返回值区分进程后,既可以指定他们的流程了,上例中他们的流程分别如下:

exec函数

用fork创建子进程后执行的是和父进程相同的程序,子进程也可以通过exec函数执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。功能上类似C的system函数。

一个示例如下:

#include <unistd.h>
#include <stdlib.h>int main(void)
{execlp("ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);perror("exec ps");exit(1);
}
来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/linzhenjie/p/5485631.html

Linux高级编程--06.进程概述相关推荐

  1. 【Linux系统编程】进程概述和进程号

    00. 目录 文章目录 00. 目录 01. 进程概述 02. 进程状态 03. 进程控制块 04. 进程号 05. 进程号相关函数 06. 案例实战 07. 附录 01. 进程概述 我们平时写的 C ...

  2. Linux系统编程06 --进程间关系

    文章目录 六.进程间关系 终端 **tty** 网络终端 进程组 会话 setsid()创建新会话函数 getsid()获取会话sid函数 守护进程 守护进程创建步骤 六.进程间关系 终端 ​ 在UN ...

  3. 嵌入式系统开发学习步骤(Linux高级编程学习顺序)

    2019独角兽企业重金招聘Python工程师标准>>> 嵌入式系统开发学习步骤(Linux高级编程学习顺序) 1.Linux 基础 安装Linux操作系统 Linux文件系统 Lin ...

  4. linux web高级编程,寒假学习 第16.17天 (linux 高级编程)

    寒假学习 第16.17天 (linux 高级编程) 笔记 总结 一.进程的基本控制(进程的同步) 1.进程的常见控制函数 pause   sleep/usleep atexit   on_exit i ...

  5. 【Linux系统编程】进程间通信概述

    00. 目录 文章目录 00. 目录 01. 进程间通信概述 02. 进程间通信目的 03. 进程间通信机制 04. 附录 01. 进程间通信概述 进程是一个独立的资源分配单元,不同进程(这里所说的进 ...

  6. linux系统编程之进程(八):守护进程详解及创建,daemon()使用

    linux系统编程之进程(八):守护进程详解及创建,daemon()使用 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等 ...

  7. 【Linux系统编程】进程退出和回收进程资源

    00. 目录 文章目录 00. 目录 01. 进程退出函数 02. 进程退出讨论 03. 回收进程资源 04. 附录 01. 进程退出函数 #include <stdlib.h>void ...

  8. vbs结束进程代码_物联网学习教程—Linux系统编程之进程控制

    Linux系统编程之进程控制 一.结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳 ...

  9. Linux系统编程之进程与线程控制原语对比

    Linux系统编程之进程与线程控制原语对比 进程 线程 fork pthread_create exit pthread_exit wait pthread_join kill pthread_can ...

最新文章

  1. 【C++】LINK类型错误分析记录
  2. 怎么求人眼图像中的噪声
  3. linux 抓包 tcpdump和Wireshark
  4. 前端js变量踩坑,部分手机浏览器不支持let、const
  5. WCF 使用证书认证 方法
  6. 花瓣长度和花瓣宽度散点图鸢尾花_[创意榫卯结构] 形如花瓣的燕尾榫,不但美,而且非常牢固...
  7. PHP网站首页空白刷新就好了,部署好后网站一片空白,不显示内容
  8. 所有for循环都可以用while循环改写python_python-for循环与while循环
  9. 微信小程序icon图标使用详解
  10. 一个合格的程序员应该读过哪些书
  11. 名字打架小游戏 java_闲暇极品MD5 能用名字打架的小游戏
  12. switch【茶杯头xic】破解xic文件下载
  13. 群晖系统,部署JAVA-JAR包,SpringBoot项目,手工启动
  14. 数字电路专题:常用逻辑门符号
  15. 绝佳的充电时间:自我隔离时何不探索这些数据科学技术
  16. 8086CPU寄存器全称
  17. Guitar Pro教程之记谱法简介
  18. 在Excel中优化跨页的合并单元格,避免打印后产生空白
  19. 如何通过分析网页源码下载淘宝教育视频
  20. 关于photoshop软件的177个小技巧

热门文章

  1. 双指针:JZ21调整数组顺序使奇数位于偶数前面 Offer 57. 和为s的两个数字
  2. 如何用ssh工具连接自己的“小米手机”——雷总看了直呼内行!!!
  3. IDEA导入Eclipse项目的方法步骤(图文教程)
  4. editview只输入英文_入门小百科丨如何在电脑/手机输入日语
  5. 小程序 getphonenumber_小程序入门,看这一篇就够了!
  6. python爬取邮件内容_登陆邮箱 爬取邮件
  7. pyecharts显示所有x轴_基于Pyecharts可视化大屏案例一(1)
  8. python逐行写入文件_python逐行读写txt文件的实例讲解
  9. 华为ax3怎么接光纤sc接口_光纤收发器接口类型、连接、指示灯说明及故障症断...
  10. LeetCode Week 5:第 41 ~ 50 题