05 | 学会几个系统调用:咱们公司能接哪些类型的项目?
刘超
该思维导图由 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
《趣谈 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-054238 - TinnyFlames关于操作系统,有一本国外的教材叫做OSTEP(Operating System Three Easy Picies) 虽然貌似没有中文版的,但里面的内容讲的相当通俗易懂,强烈推荐给大家作为理论层面的补充
作者回复: 推荐给大家
2019-04-059225 - 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-0912139 - rocedu文件,虚存,进程三大核心概念都谈到了。学习系统调用,专栏可以作为学习地图进行之路,下面还有下极大的功夫。给大家推荐一本非常棒的入门图书Unix/Linux编程实践教程(Understanding UNIX/LINUX Programming),绝版了,但是网上能搜到电子版,看到这本书真是相见恨晚。我的博客https://www.cnblogs.com/rocedu/p/6016880.html就是对这本书的核心方法的总结,供大家参考。
作者回复: 赞
2019-04-05379 - 刘強所有把socket翻译成套接字的文章,我一律不看。原因是socket的本意已经很清楚的说明了它的作用,我们翻译成套接字,平白无故的给读者增加了理解的难度。我觉得这个词除了能装逼,别于他用。作者是明白人,是现在读者的角度考虑的。这是真大牛!
作者回复: 谢谢啦
2019-04-05465 - 美美上面推荐的国外的教材叫OSTEP(Operating System Three Easy Picies) 已经有中文版了,顶上去让大家知道:https://book.douban.com/subject/33463930/
作者回复: 好书
2019-08-23250 - 不专注的linuxer老师、各位同学,大家好! “fork 系统调用的返回值,如果当前进程是子进程,就返回 0;如果当前进程是父进程,就返回子进程的进程号” 这句话到意思是不是说,父进程调用fork创建子进程之后,得到CPU执行权的可能是父进程叶可能是子进程,所以要从返回值区分一下? 不是很理解这个具体的过程,有谁可以解释一下吗?
作者回复: 既然fork是复制,就说明父进程和子进程在用户态的代码段是一模一样的,如果fork这个系统调用后面的语句都是A,则无论是父进程,还是子进程都是接下来要执行A的。好在fork是一个系统调用,刚从内核返回的时候,由于内核是能够区分父进程和子进程的,因而用户态的程序代码里面,往往通过这个返回值来判断自己是父进程还是子进程,因为子进程如果不判断一下,是不知道自己是子进程的。这和CPU执行权也没有关系。就是代码执行完fork以后,由于父子进程的代码是一模一样的,父进程和子进程都不知道自己是哪一个,但是判断返回值就知道了。
2019-08-14539 - 爷爷刘大另外还有一点,文件描述符不是面向操作系统的,而是针对进程的,所以同一个文件在不同的进程里可能会有不同的fd。其实换个理解方式就好懂了:因为操作系统里有太多的文件,一个进程大概率不需要知道所有的文件,所以每当进程用到文件的时候,就像系统要来这个文件,对进程来说,一个类似于数组的东西就可以管理到所有系统分配给他的文件,所以fd就是按照自然数顺序依次排列的,0表示标准输入,1是标准输出,2是标准错误,这三个是固定的,后面的用到就依次往后加。相当于是个下标index的概念。
作者回复: 是的
2019-05-05330 - gwwwwt刘老师,您好,我想问一下,Linux内核源代码下载后需要编译么? 另外,您能推荐一个Mac上读kernel源码的软件么?感谢。。
作者回复: 看源码不用编译,但是改代码需要,后面实验环节有这部分
2019-04-05327 - Loner可以自己搭个opengork服务器,教程百度有,很方便的看linux 源代码
作者回复: 赞
2019-04-0726
收起评论