系统调用,库函数以及Linux下与进程相关的指令操作

操作系统怎么为我们提供服务

我们知道,操作系统是管理的软件。那么有的时候,用户需要服务,那么对应的操作系统就要提供对应的服务来给用户。但是,由于各种各样的因素。操作系统不相信任何人,也就是说,操作系统为了保护自身。会将其内部的实现细节封装。防止用户有意或者无意的操作破坏内部结构,同时操作系统还需要对外提供服务的方式给用户。 而操作系统提供给用户服务就是通过系统调用 来提供的。
而对于操作系统提供系统调用的方式有很多种。在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下区分进程的标识.就如同学生在校的学号一样!


以上就是本篇文章的主要内容,如有不足之处希望指出.

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值