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

05 | 学会几个系统调用:咱们公司能接哪些类型的项目?

sem_post
sem_wait
shmat
shmget
msgrcv
msgsnd
msgget
数据段
代码段
封装系统调用
套接字Socket
TCP/IP网络协议栈
信号量
共享内存
消息队列
sigaction
信号
write
read
lseek
creat
close
open
mmap
brk
进程内存空间
waitpid
execve
fork
Glibc
网络通信
进程间通信
信号处理
文件管理
进程管理
创建进程
Linux系统调用

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

上一节我们讲了几个重要的 Linux 命令行,只有通过这些命令,用户才能把 Linux 系统用起来,不知道你掌握得如何了?其实 Linux 命令也是一个程序,只不过代码是别人写好的,你直接用就可以了。你可以自己试着写写代码,通过代码把 Linux 系统用起来,这样印象会更深刻。
不过,无论是别人写的程序,还是你写的程序,运行起来都是进程。如果你是一家外包公司,一个项目的运行要使用公司的服务,那就应该去办事大厅,也就是说,你写的程序应该使用系统调用。
你看,系统调用决定了这个操作系统好用不好用、功能全不全。对应到咱们这个公司中,作为一个老板,你应该好好规划一下,你的办事大厅能够提供哪些服务,这决定了你这个公司会被打五星还是打差评。

立项服务与进程管理

首先,我们得有个项目,那就要有立项服务。对应到 Linux 操作系统中就是创建进程
创建进程的系统调用叫fork这个名字很奇怪,中文叫“分支”。为啥启动一个新进程叫“分支”呢?
在 Linux 里,要创建一个新的进程,需要一个老的进程调用 fork 来实现,其中老的进程叫作父进程(Parent Process),新的进程叫作子进程(Child Process)。
前面我们说过,一个进程的运行是要有一个程序的,就像一个项目的执行,要有一个项目执行计划书。本来老的项目,按照项目计划书按部就班地来,项目执行到一半,突然接到命令,说是要新启动一个项目,这个时候应该怎么办呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了学习Linux系统调用的重要性以及通过学习系统调用来掌握Linux系统的方法。文章首先讲解了创建进程的系统调用fork的原理和使用方法,以及父进程和子进程的关系。其次,介绍了进程的内存管理和内存管理的系统调用,比喻了进程的内存管理与会议室管理的相似之处。接着,介绍了在堆里面分配内存的系统调用brk和mmap。文章还涉及了项目异常处理与信号处理,以及项目组间沟通与进程间通信的相关内容。此外,还介绍了公司间沟通与网络通信的方式,以及查看源代码中的系统调用和中介Glibc的作用。总之,通过系统调用的学习,读者可以快速了解Linux系统的运行原理和管理方法,为深入学习Linux系统打下基础。

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

全部留言(121)

  • 最新
  • 精选
  • 青石
    用strace跟踪"ls -al"的系统调用,大体流程如下: 1. 先执行execve,调用ls命令; 2. 调用open、read、fstat、mmap、mprotect、mmap、close读取动态链库和系统配置文件; 3. 读取passwd、group文件,获取用户信息,lstat、lgetxattr、getxattr获取文件属性,同时判断权限; 4. 调用write输出内容; 5. munmap释放内存,close关闭。

    作者回复: 赞

    2019-04-05
    4
    238
  • TinnyFlames
    关于操作系统,有一本国外的教材叫做OSTEP(Operating System Three Easy Picies) 虽然貌似没有中文版的,但里面的内容讲的相当通俗易懂,强烈推荐给大家作为理论层面的补充

    作者回复: 推荐给大家

    2019-04-05
    9
    225
  • sotey
    学习笔记+作业+提问,知识点真多啊,老师这文章货太干了。 一、 创建进程 #### 创建进程的总结: 1、Linux中父进程调用fork创建子进程。 2、父进程调用fork时,子进程拷贝所有父进程的数据接口和代码过来。 3、当前进程是子进程,fork返回0;当前进程是父进程,fork返回子进程进程号 4、如果返回0,说明当前进程是子进程,子进程请求execve系统调用,执行另一个程序。 5、如果返回子进程号,说明当前进程是父进程,按照原父进程原计划执行。 6、父进程要对子进程负责,调用waitpid将子进程进程号作为参数,父进程就能知道子进程运行完了没有,成功与否。 7、操作系统启动的时候先创建了一个所有用户进程的“祖宗进程”,课时1,第3题A选项:0号进程是所有用户态进程的祖先 ##### 创建进程的系统调用:fork ##### 执行另一个程序的系统调用:execve ##### 将子进程的进程号作为参数传给它,父进程就能知道子进程运行完了没有,成功与否:waitpid 二、 内存管理 ##### 内存管理总结 1、每个进程都有独立的进程内存空间,互相之间不干扰。(隔离性) 2、进程内存空间,存放程序代码的部分,称为代码段(Code Segment)。 3、存放进程运行中产生数据的部分,称为数据段(Data Segment)。 4、进程写入数据的时候,现用现分物理内存给进程使用。 5、分配内存数量比较小时,使用brk调用,会和原来的堆数据连在一起。 6、需要分配的内存数据量比较大的时候,使用mmap,重新划分一块内存区域。 ##### 分配较小内存数量,和原来堆内数据连在一起:brk ##### 分配较大内存数量,重新划分一块内存区域:mmap 三、 文件管理 ##### 文件的操作六个最重要系统调用: ##### 打开文件:open ##### 关闭文件:close ##### 创建文件:creat ##### 打开文件后跳到文件某个位置:lseek ##### 读文件:read ##### 写文件:write ##### Linux一切皆文件 ##### 一切皆文件的优势即使统一了操作的入口,提供了极大的便利。 四、 信号处理(异常处理) 进程执行过程中一旦有变动,就可以通过信号处理服务及时处理。 五、 进程间通信 #### 有两种方式实现进程间通信 #### 消息队列方式 ##### 创建一个新的队列:msgget ##### 发送消息到消息队列:msgsnd ##### 取出队列中的消息:msgrcv 六、 共享内存方式 ##### 创建共享内存块:shmget ##### 将共享内存映射到自己的内存空间:shmat #### 利用信号量实现隔离性 ##### 占用信号量:sem_wait ##### 释放信号量:sem_post 伪代码: 假设信号量为1 signal = 1 sem_wait伪代码 while True { if sem_wait == 1; signal -=1; break; } code.code; sem_post伪代码 signal +=1; 七、 网络通信 ##### 网络插口:socket ##### 网络通信遵循TCP/IP网络协议栈 ##### 八、 glibc ##### glibc是Linux下开源标准C库 ##### glibc把系统调用进一步封 ##### sys_open对应glibc的open函数 ##### 一个单独的glibcAPI可能调用多个系统调用 ##### printf函数调用sys_open、sys_mmap、sys_write、sys_close等等系统调用 ### 课后作业 strace ls -la 查看有如下系统调用 execve brk mmap access open fstat mmap close read stat write lseek lstat getxattr socket connect mprotect ##### 疑问:局部变量,在当前函数执行的时候起作用,就是说当前函数执行中产生的局部变量是存放在内存中的。为什么不是暂存在CPU缓存或者寄存器,进入另一个函数时,丢掉局部变量,而不写入内存,提升效率。

    作者回复: 哪有这么多寄存器

    2019-04-09
    12
    139
  • rocedu
    文件,虚存,进程三大核心概念都谈到了。学习系统调用,专栏可以作为学习地图进行之路,下面还有下极大的功夫。给大家推荐一本非常棒的入门图书Unix/Linux编程实践教程(Understanding UNIX/LINUX Programming),绝版了,但是网上能搜到电子版,看到这本书真是相见恨晚。我的博客https://www.cnblogs.com/rocedu/p/6016880.html就是对这本书的核心方法的总结,供大家参考。

    作者回复: 赞

    2019-04-05
    3
    79
  • 刘強
    所有把socket翻译成套接字的文章,我一律不看。原因是socket的本意已经很清楚的说明了它的作用,我们翻译成套接字,平白无故的给读者增加了理解的难度。我觉得这个词除了能装逼,别于他用。作者是明白人,是现在读者的角度考虑的。这是真大牛!

    作者回复: 谢谢啦

    2019-04-05
    4
    65
  • 美美
    上面推荐的国外的教材叫OSTEP(Operating System Three Easy Picies) 已经有中文版了,顶上去让大家知道:https://book.douban.com/subject/33463930/

    作者回复: 好书

    2019-08-23
    2
    50
  • 不专注的linuxer
    老师、各位同学,大家好! “fork 系统调用的返回值,如果当前进程是子进程,就返回 0;如果当前进程是父进程,就返回子进程的进程号” 这句话到意思是不是说,父进程调用fork创建子进程之后,得到CPU执行权的可能是父进程叶可能是子进程,所以要从返回值区分一下? 不是很理解这个具体的过程,有谁可以解释一下吗?

    作者回复: 既然fork是复制,就说明父进程和子进程在用户态的代码段是一模一样的,如果fork这个系统调用后面的语句都是A,则无论是父进程,还是子进程都是接下来要执行A的。好在fork是一个系统调用,刚从内核返回的时候,由于内核是能够区分父进程和子进程的,因而用户态的程序代码里面,往往通过这个返回值来判断自己是父进程还是子进程,因为子进程如果不判断一下,是不知道自己是子进程的。这和CPU执行权也没有关系。就是代码执行完fork以后,由于父子进程的代码是一模一样的,父进程和子进程都不知道自己是哪一个,但是判断返回值就知道了。

    2019-08-14
    5
    39
  • 爷爷刘大
    另外还有一点,文件描述符不是面向操作系统的,而是针对进程的,所以同一个文件在不同的进程里可能会有不同的fd。其实换个理解方式就好懂了:因为操作系统里有太多的文件,一个进程大概率不需要知道所有的文件,所以每当进程用到文件的时候,就像系统要来这个文件,对进程来说,一个类似于数组的东西就可以管理到所有系统分配给他的文件,所以fd就是按照自然数顺序依次排列的,0表示标准输入,1是标准输出,2是标准错误,这三个是固定的,后面的用到就依次往后加。相当于是个下标index的概念。

    作者回复: 是的

    2019-05-05
    3
    30
  • gwwwwt
    刘老师,您好,我想问一下,Linux内核源代码下载后需要编译么? 另外,您能推荐一个Mac上读kernel源码的软件么?感谢。。

    作者回复: 看源码不用编译,但是改代码需要,后面实验环节有这部分

    2019-04-05
    3
    27
  • Loner
    可以自己搭个opengork服务器,教程百度有,很方便的看linux 源代码

    作者回复: 赞

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