Linux高级编程--06.进程概述
进程控制块
在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);
}
转载于:https://www.cnblogs.com/linzhenjie/p/5485631.html
Linux高级编程--06.进程概述相关推荐
- 【Linux系统编程】进程概述和进程号
00. 目录 文章目录 00. 目录 01. 进程概述 02. 进程状态 03. 进程控制块 04. 进程号 05. 进程号相关函数 06. 案例实战 07. 附录 01. 进程概述 我们平时写的 C ...
- Linux系统编程06 --进程间关系
文章目录 六.进程间关系 终端 **tty** 网络终端 进程组 会话 setsid()创建新会话函数 getsid()获取会话sid函数 守护进程 守护进程创建步骤 六.进程间关系 终端 在UN ...
- 嵌入式系统开发学习步骤(Linux高级编程学习顺序)
2019独角兽企业重金招聘Python工程师标准>>> 嵌入式系统开发学习步骤(Linux高级编程学习顺序) 1.Linux 基础 安装Linux操作系统 Linux文件系统 Lin ...
- linux web高级编程,寒假学习 第16.17天 (linux 高级编程)
寒假学习 第16.17天 (linux 高级编程) 笔记 总结 一.进程的基本控制(进程的同步) 1.进程的常见控制函数 pause sleep/usleep atexit on_exit i ...
- 【Linux系统编程】进程间通信概述
00. 目录 文章目录 00. 目录 01. 进程间通信概述 02. 进程间通信目的 03. 进程间通信机制 04. 附录 01. 进程间通信概述 进程是一个独立的资源分配单元,不同进程(这里所说的进 ...
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
linux系统编程之进程(八):守护进程详解及创建,daemon()使用 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等 ...
- 【Linux系统编程】进程退出和回收进程资源
00. 目录 文章目录 00. 目录 01. 进程退出函数 02. 进程退出讨论 03. 回收进程资源 04. 附录 01. 进程退出函数 #include <stdlib.h>void ...
- vbs结束进程代码_物联网学习教程—Linux系统编程之进程控制
Linux系统编程之进程控制 一.结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳 ...
- Linux系统编程之进程与线程控制原语对比
Linux系统编程之进程与线程控制原语对比 进程 线程 fork pthread_create exit pthread_exit wait pthread_join kill pthread_can ...
最新文章
- 【C++】LINK类型错误分析记录
- 怎么求人眼图像中的噪声
- linux 抓包 tcpdump和Wireshark
- 前端js变量踩坑,部分手机浏览器不支持let、const
- WCF 使用证书认证 方法
- 花瓣长度和花瓣宽度散点图鸢尾花_[创意榫卯结构] 形如花瓣的燕尾榫,不但美,而且非常牢固...
- PHP网站首页空白刷新就好了,部署好后网站一片空白,不显示内容
- 所有for循环都可以用while循环改写python_python-for循环与while循环
- 微信小程序icon图标使用详解
- 一个合格的程序员应该读过哪些书
- 名字打架小游戏 java_闲暇极品MD5 能用名字打架的小游戏
- switch【茶杯头xic】破解xic文件下载
- 群晖系统,部署JAVA-JAR包,SpringBoot项目,手工启动
- 数字电路专题:常用逻辑门符号
- 绝佳的充电时间:自我隔离时何不探索这些数据科学技术
- 8086CPU寄存器全称
- Guitar Pro教程之记谱法简介
- 在Excel中优化跨页的合并单元格,避免打印后产生空白
- 如何通过分析网页源码下载淘宝教育视频
- 关于photoshop软件的177个小技巧
热门文章
- 双指针:JZ21调整数组顺序使奇数位于偶数前面 Offer 57. 和为s的两个数字
- 如何用ssh工具连接自己的“小米手机”——雷总看了直呼内行!!!
- IDEA导入Eclipse项目的方法步骤(图文教程)
- editview只输入英文_入门小百科丨如何在电脑/手机输入日语
- 小程序 getphonenumber_小程序入门,看这一篇就够了!
- python爬取邮件内容_登陆邮箱 爬取邮件
- pyecharts显示所有x轴_基于Pyecharts可视化大屏案例一(1)
- python逐行写入文件_python逐行读写txt文件的实例讲解
- 华为ax3怎么接光纤sc接口_光纤收发器接口类型、连接、指示灯说明及故障症断...
- LeetCode Week 5:第 41 ~ 50 题