所谓系统调用,就是内核提供的、功能十分强大的一系列的函数。这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门(gate)陷入(trap)实现。系统调用是用户程序和内核交互的接口。
5个系统调用∶open,write,read,close,ioctl
Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。
交互进程——由一个shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。批处理进程——这种进程和终端没有联系,是一个进程序列。监控进程(也称守护进程)——Linux系统启动时启动的进程,并在后台运行。在Shell环境下,如何查看远程Linux系统运行了多少时间?
ssh user@被监控主机ip "uptime"
ssh 用于远程登录;
uptime命令可以查看当前linux系统运行了多长时间;
scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。
scp [可选参数] file_source file_target地址解析协议,即ARP(Address Resolution Protocol),是根据 IP地址 获取 物理地址的一个TCP/IP协议 。 主
机发送信息时将包含目标IP地址的ARP请求**广播(broadcast)**到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
进程A读取B进程中的某个变量(非共享内存),可行的方式有什么? (1)B进程向消息队列写入一个包含变量内容的消息,A进程从队列中读出。 (2)通过本地环路通信。 (3)如果A、B 非亲属,那么A通过命名管道把这个变量的地址发给B进程。 (4)如果 B是A 进程的子进程,那么B直接读取变量内容即可。
首先,上面四个通信方式: (1)是消息队列的实现方式。 (2)是本地Socket通信方式。 (3)是命名管道通信方式。 (4)是通过fork子进程的方式。
实际可行的是 (1)和(2)。
对于(3),命名管道虽然可以通讯,但是把变量的地址传递过去是没有用的,因为不同的进程的地址空间是独立的,谁也不能访问谁的,只有传值才行,传地址是不行的。 对于(4),子进程虽然是由父进程fork()出来的,但是仍然属于两个进程,不同进程之间也是独立的,子进程无权读取父进程的变量。
Linux下两个进程可以同时打开同一个文件,则:
两个进程中分别生成两个独立的fd两个进程可以任意对文件进行读写操作,操作系统并不保证写的原子性进程可以通过系统调用对文件加锁,从而实现对文件内容的保护一般删除都是文件索引,如果两个文件同时打开同一个文件,一个线程执行删除操作,只要另一个线程不退出,就可以继续对该文件进行操作,一旦退出才找不到该文件的索引节点而报错两个进程可以分别读取文件的不同部分而不会相互影响一个进程对文件长度和内容的修改另外一个进程可以立即感知一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来的进程几乎完全相同的进程,也就是两个进程可以做完全相同的事情。但是,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
下列程序代码在Linux系统执行后"*"会被输出多少次?
void main() { int i; for(i=0;i<3;i++) { fork(); printf("*\n"); } return; }在上面的这段代码中,每次运行到fork(),当前程序就会自动克隆一个自己,而输出的时候有\n,刷新了缓冲区,因此: 因此,最后输出为14个*。
以上三者都可以合并代码
而对于git blame命令,则是会逐行显示文件,并在每一行的行首显示commit号,提交者。最早提交日期等,并不是合并代码的命令。
Unix系统由以下4部分组成:
Kernel(内核)Shell(外壳)文件系统应用程序组标识号(GID):是当前用户缺省的工作组标识,具有相似属性的多个用户可以被分配到同一个组,每个组都有自己的组名,且以组标识号区分,除了在/etc/passwd指明其归属的组外,还在/etc/group中指明组包含的用户。
Q:通过编辑/etc/group文件来改变了sales group的GID,所有的组员都能成功的进行的转换,除了Jack,他甚至都无法登陆,原因是什么?
A:/etc/group是用户组信息文件,里面定义了用户组的ID, /etc/passwd是用户基本信息文件,里面定义了用户的ID,用户组的ID等相关信息,所以因为两个文件中都定义了用户组的信息,所以两个文件应该都要改过来,否则会导致用户找不到所属组。
Q:编译内核时,可以使用哪些命令对内核进行配置?
A:
make configmake menuconfigmake oldconfigmake xconfig使用fork函数得到的子进程从父进程继承了整个进程的地址空间,包括: 进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。
子进程和父进程的不同之处在于:
父进程设置的锁,子进程不会继承(因为如果是排它锁,如果被继承,自然就矛盾了)各自的进程ID父进程的ID是不同的。子进程未决告警被清除。子进程的未决信号集设置为空集。通常,一个进程由三个部分组成:进程控制块(PCB)、数据和程序。
在UNIX中,一个进程也由三个部分组成:进程控制块、数据段和共享正文段,并有其自身的不同含义。
进程运行时用到的数据以及工作区,构成了一个进程的数据段。 需要注意的是,如果进程执行的程序是不能被共享的,那么也把他归入到数据段中。
为了管理好进程的共享正文段,UNIX在内存专门开辟一个text结构区域,形成正文段text[]。
因此,划分进程为进程控制块、数据段和共享正文段可以实现:
共享正文共享数据可重入