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

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

有了系统调用,咱们公司就能开始批量接项目啦!对应到 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 操作系统》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(122)

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

    作者回复: 赞

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

    作者回复: 这本书很赞

    4
    84
  • 沐夜星光
    "这个过程有点绕,但是是不是也很巧妙?"还是不明白,这么绕的用意在哪里,代理代码第一次调用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去调用。

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

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

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

    作者回复: 是的,是的

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

    作者回复: 赞

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

    作者回复: 赞

    2
    11
  • 四月长安
    请问老师,不是所有进程的祖宗进程都是0号进程吗

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

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

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

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

    作者回复: 赞

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