linux具有不同的三种接口:系统调用接口、库函数接口、应用程序接口。
用户启动shell窗口下进行工作。
shell里先运行输入的命令行中的第一个字符串,搜索这个程序名,找到了就运行同时挂起shell,直至运行完毕。shell是普通的用户程序,功能是读取用户的输入和显示计算的输出。
控制命令操作或指定可选值的参数称为标志,用-表示。
对于
head -20 file #打印文件的前 20 行 head 20 file #输出文件名为 20 的文件的前 10 行,然后输出文件名为 file 文件的前 10 行。
shell支持魔法字符
*匹配一个或者多个可能的字符、?匹配任意一个字符(leetcode有一道例题的)
shell 启动时,就会获取 标准输入、标准输出、标准错误文件进行访问的能力。
管道:由管道符号连接的命令集合。
常见命令
cp 是将文件进行复制,复制完成后会有两个文件 a 和 b;
mv 相当于是文件的移动,移动完成后就不再有 a 文件;
cat 命令可以把多个文件内容进行连接;
使用 rm 可以删除文件;
使用 chmod 可以允许所有者改变访问权限;
文件目录的的创建和删除可以使用 mkdir 和 rmdir 命令;
使用 ls 可以查看目录文件,ls 可以显示很多属性,比如大小、用户、创建日期等;
sort 决定文件的显示顺序
grep 从标准输入或者一个或多个输入文件中提取特定模式的行;
sort 将输入进行排序并输出到标准输出;
head 提取输入的前几行;
tail 提取输入的后面几行;
除此之外的过滤器还有 cut 和 paste,允许对文本行的剪切和复制;
od 将输入转换为 ASCII ;
tr 实现字符大小写转换;
pr 为格式化打印输出。
linux的内核结构其主要作用就是I/O交互、内存管理和控制CPU访问。
进程
fork系统调用会创建一个源进程的拷贝。fork创建出来的称为子进程,父进程与子进程相互独立。但是对于共享文件,会同时可见。
通信机制有6种
1.信号
不同信号的用处
其中,
SIGKILL 信号发送到进程以使其马上进行终止。 与 SIGTERM 和 SIGINT 相比,这个信号无法捕获和忽略执行,并且进程在接收到此信号后无法执行任何清理操作,下面是一些例外情况
僵尸进程无法杀死,因为僵尸进程已经死了,它在等待父进程对其进行捕获。
处于阻塞状态的进程只有再次唤醒后才会被 kill 掉
init 进程是 Linux 的初始化进程,这个进程会忽略任何信号。
SIGKILL 通常是作为最后杀死进程的信号、它通常作用于 SIGTERM 没有响应时发送给进程。
进程可以选择忽略发送过来的信号,但是有两个是不能忽略的:SIGSTOP 和 SIGKILL 信号。SIGSTOP 信号会通知当前正在运行的进程执行关闭操作,SIGKILL 信号会通知当前进程应该被杀死。除此之外,进程可以选择它想要处理的信号,进程也可以选择阻止信号,如果不阻止,可以选择自行处理,也可以选择进行内核处理。如果选择交给内核进行处理,那么就执行默认处理。
2.管道
举例:
sort <f | head
它会创建两个进程,一个是 sort,一个是 head,sort,会在这两个应用程序之间建立一个管道使得 sort 进程的标准输出作为 head 程序的标准输入。sort 进程产生的输出就不用写到文件中了,如果管道满了系统会停止 sort 以等待 head 读出数据
3.共享内存
在使用共享内存前,需要经过一系列的调用流程,流程如下
创建共享内存段或者使用已创建的共享内存段(shmget())
将进程附加到已经创建的内存段中(shmat())
从已连接的共享内存段分离进程(shmdt())
对共享内存段执行控制操作(shmctl())
4.FIFO队列
命名管道,会更加安全,不会丢失。
5.消息队列
6.套接字Socket
计网里面的TCP UDP协议。
常见的系统调用
用于执行驻留在活动进程中的文件的系统调用是?exec
存储未初始化的全局变量和未初始化的 static 变量的是(bss段 )