系统调用的目的是什么?
进程与操作系统的接口由系统调用提供。通常,系统调用以汇编语言指令的形式提供。它们也包含在汇编级程序员使用的手册中。当用户模式下的进程需要访问资源时,通常会进行系统调用。然后,它请求内核通过系统调用提供资源。
通常,在以下情况下需要系统调用:
- 如果文件系统需要创建或删除文件。从文件读取和写入也需要系统调用。
- 创建和管理新进程。
- 网络连接也需要系统调用。这包括发送和接收数据包。
- 访问硬件设备(例如打印机、扫描仪等)需要系统调用。
系统调用的类型
系统调用主要有五种类型。详细解释如下:
进程控制
这些系统调用处理诸如进程创建、进程终止等进程。
文件管理
这些系统调用负责文件操作,例如创建文件、读取文件、写入文件等。
设备管理
这些系统调用负责设备操作,例如从设备缓冲区读取、写入设备缓冲区等。
信息维护
这些系统调用处理信息及其在操作系统和用户程序之间的传输。
通信
这些系统调用对于进程间通信很有用。它们还处理创建和删除通信连接。
以下是 Windows 和 Unix 中所有上述类型系统调用的示例:
系统调用的类型 | Windows | Linux |
---|---|---|
进程控制 | CreateProcess() ExitProcess() WaitForSingleObject() | fork() exit() wait() |
文件管理 | CreateFile() ReadFile() WriteFile() CloseHandle() | open() read() write() close() |
设备管理 | SetConsoleMode() ReadConsole() WriteConsole() | ioctl() read() write() |
信息维护 | GetCurrentProcessID() SetTimer() Sleep() | getpid() alarm() sleep() |
通信 | CreatePipe() CreateFileMapping() MapViewOfFile() | pipe() shmget() mmap() |
系统调用的目的
如上所示,有许多不同的系统调用。其中一些系统调用的目的是:
open()
open() 系统调用用于提供对文件系统中文件的访问权限。此系统调用为文件分配资源,并提供一个句柄,进程使用该句柄来引用该文件。多个进程可以同时打开一个文件,也可以限制为一个进程。这完全取决于文件组织和文件系统。
read()
read() 系统调用用于访问存储在文件系统中的文件中的数据。要读取的文件可以通过其文件描述符来识别,并且在读取之前应使用 open() 打开它。通常,read() 系统调用接受三个参数,即文件描述符、存储读取数据的缓冲区以及要从文件中读取的字节数。
write()
write() 系统调用将数据从用户缓冲区写入设备(例如文件)。此系统调用是程序输出数据的方法之一。通常,write() 系统调用接受三个参数,即文件描述符、存储数据的缓冲区的指针以及要从缓冲区写入的字节数。
close()
close() 系统调用用于终止对文件系统的访问。使用此系统调用意味着程序不再需要该文件,因此缓冲区被刷新,文件元数据被更新,并且文件资源被释放。
wait()
在某些系统中,进程可能会等待另一个进程完成其执行。当父进程创建子进程并且父进程的执行被挂起直到子进程执行时,就会发生这种情况。父进程的挂起是通过 wait() 系统调用发生的。当子进程完成执行时,控制权将返回给父进程。
此系统调用在已运行进程的上下文中运行可执行文件。它替换先前的可执行文件。这称为覆盖。原始进程标识符保持不变,因为没有创建新进程,但进程的数据、堆、栈等被新进程替换。
fork()
进程使用 fork() 系统调用来创建其自身的副本进程。这是操作系统中主要的进程创建方法之一。当父进程创建子进程并且父进程的执行被挂起直到子进程执行时。当子进程完成执行时,控制权将返回给父进程。
exit()
exit() 系统调用由程序用于终止其执行。在多线程环境中,这意味着线程执行已完成。exit() 系统调用后,操作系统会回收进程使用的资源。
kill()
kill() 系统调用由操作系统用于向进程发送终止信号,敦促进程退出。但是,kill() 系统调用并不一定意味着杀死进程,它可以有多种含义。