操作系统怎么为我们提供服务
我们知道,操作系统是管理的软件。那么有的时候,用户需要服务,那么对应的操作系统就要提供对应的服务来给用户。但是,由于各种各样的因素。操作系统不相信任何人,也就是说,操作系统为了保护自身。会将其内部的实现细节封装。防止用户有意或者无意的操作破坏内部结构,同时操作系统还需要对外提供服务的方式给用户。 而操作系统提供给用户服务就是通过系统调用 来提供的。
而对于操作系统提供系统调用的方式有很多种。在window下是通过各种图形化界面,而在Linux下就是各种指令。那么我们接下来就来详谈一下这个系统调用。
什么是系统调用
前面我们知道,系统调用是操作系统为我们提供服务。那么系统调用究竟是什么呢? 以Linux操作系统为例,我们知道,Linux内核是使用C语言写的,也就意味这无论是操作系统内部的实现细节,还是操作系统提供给用户的接口。都是C语言的函数! 换言之,所谓的系统调用接口,本质就是操作系统给我们提供的C语言函数接口。那么这时候就有一个问题了,windows和Linux的系统调用会一样吗? 答案显然是不同的,具体的系统调用因系统内部实现的细节而定!不过window和Linux系统的系统调用本质上都是C语言函数
库函数和系统调用
接下来我们回到C语言,我们知道C语言有一个函数printf,这个函数负责向显示器打印我们所需要的数据。那么这里就有一个问题,C语言的库函数本身可以操作硬件吗? 答案显然是否定的!但是printf确实打印出了数据! 我们知道,能够向硬件发出决策指令的必然是操作系统。既然是操作系统为我们向显示器打印了数据。那么必然是通过了系统调用的方式,换言之,printf函数的实现细节必然是调用了对应向显示器打印数据的系统调用! 那么我们就可以得出一个结论:
库函数!=系统调用。有的库函数可能封装了系统调用。但是也有的库函数没有封装系统调用。
下面这张图可以很好帮助理解整个计算机工作的层次结构:
Linux系统下操作进程的相关指令
在正式介绍使用我们Linux的系统调用之前,我们先来使用以下有关进程的操作指令:
ps ajx —>显示系统里的所有进程的信息
而如果需要显示特定的进程信息,配合grep使用
如查看操作系统内核的进程的指令:
ps ajx | grep systemd
而由于grep自身也是一个进程,所以如果我们只想要systemd进程的信息,我们可以这样写:
ps ajx | grep systemd | grep -v grep
这就是我们在Linux下查看进程的命令,有了这个铺垫以后
我们正式介绍第一个Linux下的系统调用—>fork
fork系统调用
在使用这个系统调用之前,我们先来看看fork的说明:
这里说明,fork是一个创建子进程的系统调用,如果创建成功,给父进程返回子进程的id,如果是子进程就返回0,如果创建失败就返回-1
下面我们就来用一下这个系统调用:
/*
*使用fork系统调用
*
* */
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t id=fork();
if(id==0)
{
//说明是子进程
while(1)
{
printf("我是子进程,打印id=%d\n",id);
sleep(1);
}
}
else
{
//父进程
while(1)
{
printf("我是父进程,打印id=%d\n",id);
sleep(1);
}
return 0;
}
}
而这个id是Linux下区分进程的标识.就如同学生在校的学号一样!
以上就是本篇文章的主要内容,如有不足之处希望指出.