系统调用的类型

   根据系统调用的功能,可将其分为进程控制(类)的系统调用、进程通信(类)的系统调 用、文件操作(类)及设备管理(类)系统调用等。

  进程控制类的系统调用

  这类系统调用主要用于对进程的控制,如创建一个新的进程和终止一个进程的运行,获 得和设置进程属性等。

  (1 )创建和终止进程的系统调用。在多道程序环境下,为使多道程序能并发执行,必须 先利用创建进程的系统调用,为需要并发执行的各程序分別创建一个进程。当进程已经执 行结朿或因发生异常情况而不能继续执行时,可利用终止进程的系统调用来结朿该进程的 运行。

  (2 )获得和设置进程属性的系统调用。当创建一个(些)新进程后,为了能控制它(们) 的运行,应当能了解、确定和重新设置它(们)的属性。这些属性包括:进程标识符、进程优 先级、最大允许执行时间等。此时可利用获得进程属性的系统调用,来了解某进程的属性, 利用设置进程属性的系统调用,来确定和重新设罝进程的属性。

  (3 )等待事件触发的系统调用。进程在运行过程中,有时需要等待某事件(条件)出现 后,方可继续执行。例如,一个进程在创建了一个(些)新进程后,需要等待它(们)运行结朿 后,才能继续执行,此时可利用等待子进程结朿的系统调用进行等待。又如,在客户/服务器 模式中,若无任何客户向服务器发出消息,则服务器接收进程便无事可做,此时该进程就可 利用等待(事件)的系统调用,使自己处于等待状态,一旦有客户发来消息时,接收进程便被 唤醒,进行消息接收的处理。

  进程通信类系统调用

  在OS中经常采用两种进程通信方式,即消息传递方式和共享存储区方式。当系统中 采用消息传递方式时,在通信前,必须先打开一个连接。为此,应由源进程发出一条打开连 接的系统调用open connection,而H标进程则应利用接受选接的系统调用accept connection 表示同意进行通信;然后,在源进程和目标进程之间便可开始通信,利用发送消息的系统调 用send message或者用接收消息的系统调用receive message来交换信息。通信结束后,还须 再利用关闭连接的系统调用close connection结束通信。

  用户在利用共享存储区进行通信之前,必须先利用建立共享存储区的系统调用建立一 个共享存储区,再利用建立连接的系统凋用将该共享存储区连接到进程自身的虚地址空间 上,然后便可利用读和写共享存储区的系统调用实现相互之间的通信。

  文件操作类系统调用

  对文件进行操作的系统调用数量较多,下面简单介绍一些对文件基本操作的系统调用。

  (1 )创建和删除文件。当用户需要在系统中存放程序或数据时,可利用创建文件的系 统凋用creat,由系统根据用户提供的文件名和存取方式来创建一个新文件;当用户不再需 要某文件时,可利用删除文件的系统调用将文件删除。

  (2)打开和关闭文件。用户在第一次访问某个文件之前,应先利用打开文件的系统调 用open,将指定文件打开,即系统将在用户(程序)与该文件之间建立一条快捷通路。在文 件被打开后,系统将给用户返回一个该文件的句柄或描述符;当用户不再访问某文件时,又 可利用关闭文件的系统调用close将此文件关闭,即断开该用户程序与该文件之间的快捷 通路。

  (3 )读/写文件。用户可利用读系统调用read,从已打开的文件中读出给定数目的字 符,并送至指定的缓冲区中;同样,用户也可利用写系统凋用write,从指定的缓冲区中将给定数目的字符写入指定文件中。read和write两个系统调用是文件操作类中使用最频繁的 系统调用。

  对文件进行操作的系统调用还有:建立目录、移动文件的读/写指针及改变文件属性等。

时间: 2024-08-21 07:10:09

系统调用的类型的相关文章

kernel学习之系统调用在用户空间的访问

这篇文章是对上篇的一个补充. 如何使用系统调用 1.通过c库来使用系统调用 2.在2.6.18之前的内核使用_syscall宏来使用系统调用. 3.在2.6.19开始废除了_syscall,而使用syscall()通过向函数提供调用号和参数实现调用 c语言中系统调用 #include <unistd.h> #include <stdio.h> #include <sys/syscall.h> #include <sys/types.h> int main()

solaris的sar命令(二) 检查系统调用统计信息 (sar -c)

使用 sar -c 命令可显示系统调用统计信息. $ sar -c 00:00:00 scall/s sread/s swrit/s  fork/s  exec/s rchar/s wchar/s 01:00:00      38       2       2    0.00    0.00     149     120 示例 检查系统调用统计信息 (sar -c) 以下示例显示 sar -c 命令的输出. $ sar -c SunOS balmyday 5.10 s10_51 sun4u

linux进程管理之wait系统调用

六: wait4 ()系统调用 在父进程中,用wait4()可以获得子进程的退出状态,并且防止在父进程退出前,子进程退出造成僵死 状态.这是我们这节分析的最后一个小节了. 关于wait4()在用户空间的调用方式可以自行参考相关资料,在这里只是讨论内核对这个系统调用的实 现过程. Wait4()的系统调用入口为sys_wait4().代码如下所示: asmlinkage long sys_wait4(pid_t pid, int __user *stat_addr, int options, st

调用虚拟函数、持续化视图状态及POD类型概念

在 C++ 中,无法从某个类的构造函数中调用派生的虚拟函数,因为虚表还没有完全建立.但是在C#中好像就可以,是这样吗?为什么会有这种差别呢? 确实如此,在这个方面 C# 与 C++ 是有差别的.在 C++ 中,如果你从构造函数或者析构函数中调用虚拟函数,编译器调用的虚拟函数是定义在这个正在被构造的类实例中的(例如,如果从 Base::Base 中调用 Base::SomeVirtFn ),不是最底层派生的实例(the most derived instance),正像你说的那样,因为在最底层派生

Linux中mmap与munmap函数系统调用

内存映射函数mmap, 负责把文件内容或者其他对象映射到进程的虚拟内存空间, 通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作.文件或者其他对象被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零.munmap执行相反的操作,删除特定地址区域的对象映射. 用法: void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offs

使用ioctl“实现”自定义的系统调用

最近做的项目跟Linux内核的关系比较大,我们的项目需要在用户态触发一些 内核态的代码运行.众所周知,内核态的代码是不能直接被用户态代码调用的, 用户态代码触发内核态代码的必须要经过系统调用. 为什么选择 ioctl 那么该如何实现我们的需求呢?有几种方法: 改写内核,扩大系统调用表,添加新的系统调用 利用内核模块,覆盖没被使用或这使用频率很低的一个系统调用的处理函数 利用已有的系统调用,比如ioctl,来"实现"自定义的系统调用. 第一种方法需要修改内核,适用面比较窄:第二种方法ha

Linux创建FIFO文件类型的方法

  FIFO管道是一种文件类型,在Linux上创建FIFO非常容易,FIFO文件固有管道的特性,但和pipe管道有一定的区别,下面小编将针对FIFO管道的创建和使用做个详细介绍,以便你有个详细的了解. FIFO,又称作命名管道(named pipe),它是Linux系统中用于进程间通信的一种方法. FIFO和pipe的区别在于: FIFO在文件系统中有对应的inode,可以通过ls命令查看. sh-3.2# ls -lhF ./fifo_file 100 prwxrwxrwx 1 root ro

系统调用如何实现

  系统调用的实现与一般过程调用的实现相比,两者间有很大差异.对于系统调用,控制是由原来的用户态转换为系统态,这是借助于中断和陷入机制来完成的,在该机制中包括中断和陷入硬件机构及中断与陷入处理程序两部分. 中断和陷入硬件机构 图1所示为中断的处理过程.中断可进一步分为外中断和内中断.外中断是指由于外部设备事件所引起的中断,如通常的磁盘中断.打印机中断等;而内中断则是指由于CPU内部事件所引起的中断,如程序出错(非法指令.地址越界)等.内中断(trap)也被译为"陷入"或"陷阱

Linux系统调用详解(实现机制分析)--linux内核剖析(六)

系统调用概述 计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须有操作系统控制.也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call).在linux中系统调用是用户空间访问内核的唯一手段,除异常和陷入外,他们是内核唯一的合法入口. 一般情况下应用程序通过应用编程接口API,而不是直接通过系统调用来编程.在Unix世界,最流行的API