趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85458 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

10 | 进程:公司接这么多项目,如何管?

Linux操作系统
进程管理

该思维导图由 AI 生成,仅供参考

有了系统调用,咱们公司就能开始批量接项目啦!对应到 Linux 操作系统,就是可以创建进程了。
命令行那一节,我们讲了使用命令创建 Linux 进程的几种方式。现在学习了系统调用,你是不是想尝试一下,如何通过写代码使用系统调用创建一个进程呢?我们一起来看看。

写代码:用系统调用创建进程

在 Linux 上写程序和编译程序,也需要一系列的开发套件,就像 Visual Studio 一样。运行下面的命令,就可以在 centOS 7 操作系统上安装开发套件。在以后的章节里面,我们的实验都是基于 centOS 7 操作系统进行的。
yum -y groupinstall "Development Tools"
接下来,我们要开始写程序了。在 Windows 上写的程序,都会被保存成.h 或者.c 文件,容易让人感觉这是某种有特殊格式的文件,但其实这些文件只是普普通通的文本文件。因而在 Linux 上,我们用 Vim 来创建并编辑一个文件就行了。
我们先来创建一个文件,里面用一个函数封装通用的创建进程的逻辑,名字叫 process.c,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
extern int create_process (char* program, char** arg_list);
int create_process (char* program, char** arg_list)
{
pid_t child_pid;
child_pid = fork ();
if (child_pid != 0)
return child_pid;
else {
execvp (program, arg_list);
abort ();
}
}
这里面用到了咱们学过的 fork 系统调用,通过这里面的 if-else,我们可以看到,根据 fork 的返回值不同,父进程和子进程就此分道扬镳了。在子进程里面,我们需要通过 execvp 运行一个新的程序。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了在Linux操作系统上使用系统调用创建进程的方法,并通过实际代码演示了整个过程。文章首先详细讲解了在CentOS 7操作系统上安装开发套件和使用Vim创建并编辑程序文件的步骤,为读者提供了实际操作的指导。接着,文章提供了一个名为process.c的文件,其中封装了创建进程的通用逻辑,并使用了fork系统调用来实现父子进程的分离。此外,文章还展示了如何调用上述函数来创建一个子程序并运行最简单的命令ls。通过对ELF文件格式的详细解释,读者可以了解在Linux操作系统下编译、链接和运行程序的基本原理和过程。文章还介绍了静态链接库和动态链接库的概念,并通过实际操作演示了如何创建和使用这两种类型的库文件。此外,文章还讲解了进程树的概念,从系统启动的init进程到用户启动的进程形成的进程树。最后,文章提供了课堂练习和工具推荐,帮助读者更好地理解和分析ELF文件的格式。整体而言,本文通过实例和详细解释,帮助读者快速了解在Linux操作系统上使用系统调用创建进程的基本步骤和方法,以及程序的编译、链接和运行过程。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(126)

  • 最新
  • 精选
  • 任鹏斌
    置顶
    第一次读这篇放弃了,第二次花了40分钟对着图看懂了,原来所谓看懂都是借口

    作者回复: 赞

    2019-04-28
    3
    64
  • 上善若水
    看到程序的编译链接和库的东西,我感觉很熟悉,我就想到了之前看的一本特别好的书,推荐一下《程序员的自我修养-链接、装载和库》,这本书讲的十分不错,之前毕业时我看过,读了好几遍,然后在做项目过程中给intel移植android系统到x86_64位cpu上时通过elf等知识解决了好几个bug,感觉很有成就感。

    作者回复: 这本书很赞

    2019-04-17
    4
    85
  • 沐夜星光
    "这个过程有点绕,但是是不是也很巧妙?"还是不明白,这么绕的用意在哪里,代理代码第一次调用GOT[y]的时候,GOT[y]如果不知道,直接调用GOT[2]中的入口函数就行了,为啥要先回调,再调PLT[0],再调GOT[2],是因为有些资源在PLT[0]中,必须到那里获取吗?

    作者回复: 统一PLT和GOT的作用,PLT就是用来放代理代码的,也即stub代码的,GOT是用来存放so对应的真实代码的地址的。 ld-linux.so虽然默认会被加载,但是也是一个so,所以会放在GOT里面。要调用这个so里面的代码,也是需要从stub里面统一调用进去的,所以要回到PLT去调用。

    2019-07-16
    4
    28
  • MJ
    理论不扎实,有点懵,老师可否推荐入门书籍,课下先补补

    编辑回复: 你可以列出来哪里不懂,老师来加餐帮你们补齐。

    2019-04-17
    5
    23
  • kdb_reboot
    这篇很赞,看懂了plt和got, 这篇文章堪比<<程序员的自我修养>>啊~

    作者回复: 赞

    2019-07-08
    11
  • herongwei
    老师讲得太棒了,非常详细,非常认真,值得我们反复研读,下次打印出来文稿,放在书包里,地铁通勤路上拿出来阅读,哈哈

    作者回复: 赞

    2019-05-05
    2
    11
  • William
    老师更多提供一个全局的视图,具体细节可以看经典的CSAPP,链接的过程讲了整整一大章。

    作者回复: 是的,是的

    2019-04-17
    11
  • 落石
    简单说下作为一只小白的心路历程。看到11章线程 --> 进程呢? --> 回忆上一章 --> C程序的编译链接及文件格式 --> 点开10章 --> 没错是进程了 --> 线程和进程的关系? 这两章学下来,感觉收获很多,非常感谢老师,后续会具体聊下线程和进程之间的区别么?之前的理解就是线程是进程的子集,但在网上搜了一下不止于此。老师可以简单聊下这个么?

    作者回复: 线程不是进程的子集。进程是项目,线程是项目的执行。项目包含资源,也会有一个默认主线程来执行这个项目,也可以创建多个线程来执行这个项目

    2019-04-19
    10
  • 四月长安
    请问老师,不是所有进程的祖宗进程都是0号进程吗

    作者回复: 0号进程不是一个实实在在可以看到的进程

    2019-04-18
    2
    10
  • 蹦哒
    动态链接库查找的过程,是否可以理解为类似缓存原理:PLT[x]先直接找缓存(GOT[y]),没命中,然后从源头找(通过PLT[0]调用GOT[2]),找到了放入缓存(GOT[y]),下次就直接调用缓存了。只不过缓存没命中时通过PLT[0]调用GOT[2],而不是直接调GOT[2],因为调用都是由PLT发起的

    作者回复: 赞

    2020-06-10
    6
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部