Linux一些基础的系统调用

发布时间 2023-04-17 00:25:22作者: 这知识他不进我的脑子

进程管理

使用fork创建子进程,创建子进程时会将父进程拥有的数据结构+代码拷贝一份,然后通过execve系统调用来执行另外一个程序,替换掉数据。

fork系统调用的返回值,子进程返回值为0,父进程返回值为子进程的pid。

waitpid 父进程将子进程的pid传给系统调用,知晓子进程运行成功与否

内存管理

代码段:程序代码部分。

数据段:在运行中产生的数据,例如局部变量或者动态分配、保存一段时间的数据在

内存分配:进程使用时需要内存时才会向内存管理申请分配内存。两种方式brkmmap

brk:内存分配数量较小使用brk,和原来堆的数据连在一起。

mmap:分配内存数量较大,重新划分一块区域。

文件管理

对文件的打开(open),关闭(close),创建(create),跳转(lseek),读(read),写(write)等操作。

每个文件通过文件描述符索引操作。每个文件中有自己的索引节点,因为大的文件时分割成一个个小格分散保存的,通过索引节点按顺序跳。

信号处理

信号会打断进程,一般例如"CTRL+C","kill",硬件故障等问题都会有信号处理。

每种信号都拥有默认动作进行处理;或者说通过信号处理函数sigaction系统调用,注册一个一个信号处理函数。

进程间通信

消息队列:数据不长的消息可以使用消息队列。
msgget:创建一个新的队列

msgsnd:生产者将消息发送到消息队列

msgrcv:消费者从队列中取消息

共享内存:消息量较大的时候可以使用,减少消息拷贝的开销。

shmget:创建共享内存块

shmat:将共享内存映射到自己的内存空间

​ 需要处理“竞争问题”,出现信号量(Semaphore)机制。

sem_wait:访问前先调用,无人访问会先占用信号量。

sem_post:释放这个信号量。

网络通信

TCP/IP网络协议栈:不同机器间通信的一个标准协议。通过Socket系统调用建立通信。

其它系统调用相关

更多的系统调用查看源码,根据unistd_64.h文件查看

#define __NR_restart_syscall	  0
#define __NR_exit		  1
#define __NR_fork		  2
#define __NR_read		  3
#define __NR_write		  4
#define __NR_open		  5
#define __NR_close		  6
#define __NR_waitpid		  7
#define __NR_creat		  8
...

中介与Glibc

一个封装了操作系统提供的系统服务的开源标准C库,是对系统调用的封装。

for example:打开文件系统sys_open函数对应的就是Glibc中的open函数。

总结

一本外国教材OSTEP(Operating System Three Easy Picies)可以作为理论层面的补充。

参考文献

极客时间趣谈linux操作系统《05 | 学会几个系统调用:咱们公司能接哪些类型的项目?》

一些思考

关于fork的一些思考:为什么fork调用会返回两次知乎上的一些回答