热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux系统调用简介_系统调用简介

linux系统调用简介Tounderstandsystemcalls,firstoneneedstounderstandthedifferencebetweenkernelmode

linux系统调用简介

To understand system calls, first one needs to understand the difference between kernel mode and user mode of a CPU. Every modern operating system supports these two modes.

要了解系统调用,首先需要了解CPU的内核模式用户模式之间的区别。 每个现代操作系统都支持这两种模式。

Modes supported by the operating system

Modes supported by the operating system

操作系统支持的模式

内核模式 (Kernel Mode)

  • When CPU is in kernel mode, the code being executed can access any memory address and any hardware resource.

    当CPU处于内核模式时 ,正在执行的代码可以访问任何内存地址和任何硬件资源。

  • Hence kernel mode is a very privileged and powerful mode.

    因此,内核模式是一种非常特权和强大的模式。

  • If a program crashes in kernel mode, the entire system will be halted.

    如果程序在内核模式下崩溃,则整个系统将被暂停。

用户模式 (User Mode)

  • When CPU is in user mode, the programs don't have direct access to memory and hardware resources.

    当CPU处于用户模式时 ,程序无法直接访问内存和硬件资源。

  • In user mode, if any program crashes, only that particular program is halted.

    在用户模式下,如果任何程序崩溃,则仅停止该特定程序。

  • That means the system will be in a safe state even if a program in user mode crashes.

    这意味着即使用户模式下的程序崩溃,系统也将处于安全状态。

  • Hence, most programs in an OS run in user mode.

    因此,操作系统中的大多数程序都在用户模式下运行。

系统调用 (System Call)

When a program in user mode requires access to RAM or a hardware resource, it must ask the kernel to provide access to that resource. This is done via something called a system call.

当处于用户模式下的程序需要访问RAM或硬件资源时,它必须要求内核提供对该资源的访问。 这是通过称为系统调用的方式完成的

When a program makes a system call, the mode is switched from user mode to kernel mode. This is called a context switch.

当程序进行系统调用时,模式将从用户模式切换到内核模式。 这称为上下文切换

Then the kernel provides the resource which the program requested. After that, another context switch happens which results in change of mode from kernel mode back to user mode.

然后内核提供程序请求的资源。 此后,发生另一个上下文切换,这导致模式从内核模式更改回用户模式。

Generally, system calls are made by the user level programs in the following situations:

通常,在以下情况下,系统调用是由用户级程序进行的:

  • Creating, opening, closing and deleting files in the file system.

    在文件系统中创建,打开,关闭和删除文件。

  • Creating and managing new processes.

    创建和管理新流程。

  • Creating a connection in the network, sending and receiving packets.

    在网络中创建连接,发送和接收数据包。

  • Requesting access to a hardware device, like a mouse or a printer.

    请求访问硬件设备,例如鼠标或打印机。

In a typical UNIX system, there are around 300 system calls. Some of them which are important ones in this context, are described below.

在典型的UNIX系统中,大约有300个系统调用。 下面介绍其中一些在此方面很重要的内容。

叉子() (Fork())

The fork() system call is used to create processes. When a process (a program in execution) makes a fork() call, an exact copy of the process is created. Now there are two processes, one being the parent process and the other being the child process.

fork()系统调用用于创建进程。 当某个进程(正在执行的程序)进行fork()调用时,将创建该进程的精确副本。 现在有两个进程,一个是进程,另一个是进程。

The process which called the fork() call is the parent process and the process which is created newly is called the child process. The child process will be exactly the same as the parent. Note that the process state of the parent i.e., the address space, variables, open files etc. is copied into the child process. This means that the parent and child processes have identical but physically different address spaces. The change of values in parent process doesn't affect the child and vice versa is true too.

称为fork()调用的进程是进程,而新创建的进程称为进程。 子进程将与父进程完全相同。 注意,父进程的状态,即地址空间,变量,打开的文件等被复制到子进程中。 这意味着父进程和子进程具有相同但物理上不同的地址空间。 在父进程中更改值不会影响子进程,反之亦然。

Both processes start execution from the next line of code i.e., the line after the fork() call. Let's look at an example:

这两个过程都从下一行代码(即fork()调用之后的那一行fork()开始执行。 让我们看一个例子:

// example.c
#include
void main()
{int val; val = fork(); // line Aprintf("%d", val); // line B
}

When the above example code is executed, when line A is executed, a child process is created. Now both processes start execution from line B. To differentiate between the child process and the parent process, we need to look at the value returned by the fork() call.

当执行上述示例代码时,在执行A行时 ,将创建一个子进程。 现在,两个进程都从B行开始执行。 为了区分子进程和父进程,我们需要查看fork()调用返回的值。

The difference is that, in the parent process, fork() returns a value which represents the process ID of the child process. But in the child process, fork() returns the value 0.

不同之处在于,在父进程中,fork()返回一个表示子进程的进程ID的值。 但是在子进程中, fork()返回值0。

This means that according to the above program, the output of parent process will be the process ID of the child process and the output of the child process will be 0.

这意味着根据上述程序,父进程的输出将是子进程的进程ID ,子进程的输出将为0。

执行() (Exec())

The exec() system call is also used to create processes. But there is one big difference between fork() and exec() calls. The fork() call creates a new process while preserving the parent process. But, an exec() call replaces the address space, text segment, data segment etc. of the current process with the new process.

exec()系统调用也用于创建进程。 但是fork()exec()调用之间有一个很大的区别。 fork()调用会在保留父进程的同时创建一个新进程。 但是, exec()调用将新进程替换当前进程的地址空间,文本段,数据段等。

It means, after an exec() call, only the new process exists. The process which made the system call, wouldn't exist.

这意味着,在exec()之后,仅存在新进程。 进行系统调用的过程将不存在。

There are many flavors of exec() in UNIX, one being exec1() which is shown below as an example:

UNIX中有多种exec() ,其中一种是exec1() ,如下所示:

// example2.c
#include
void main()
{execl("/bin/ls", "ls", 0); // line Aprintf("This text won't be printed unless an error occurs in exec().");
}

As shown above, the first parameter to the execl() function is the address of the program which needs to be executed, in this case, the address of the ls utility in UNIX. Then it is followed by the name of the program which is ls in this case and followed by optional arguments. Then the list should be terminated by a NULL pointer (0).

如上所示,execl()函数的第一个参数是需要执行的程序的地址,在这种情况下,是UNIX中ls实用程序的地址。 然后,其后是程序的名称(在这种情况下为ls) ,后跟可选参数。 然后,该列表应以NULL指针(0)终止。

When the above example is executed, at line A, the ls program is called and executed and the current process is halted. Hence the printf() function is never called since the process has already been halted. The only exception to this is that, if the execl() function causes an error, then the printf() function is executed.

当执行上述示例时,在A行,将调用并执行ls程序,并暂停当前进程。 因此,由于该进程已经停止,因此永远不会调用printf()函数。 唯一的例外是,如果execl()函数导致错误,则执行printf()函数。

翻译自: https://www.studytonight.com/operating-system/system-calls

linux系统调用简介



推荐阅读
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 提升视觉效果:Unity3D中的HDR与Bloom技术(高动态范围成像与光线散射)
    提升视觉效果:Unity3D中的HDR与Bloom技术(高动态范围成像与光线散射) ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 2.2 组件间父子通信机制详解
    2.2 组件间父子通信机制详解 ... [详细]
  • 在分析和解决 Keepalived VIP 漂移故障的过程中,我们发现主备节点配置如下:主节点 IP 为 172.16.30.31,备份节点 IP 为 172.16.30.32,虚拟 IP 为 172.16.30.10。故障表现为监控系统显示 Keepalived 主节点状态异常,导致 VIP 漂移到备份节点。通过详细检查配置文件和日志,我们发现主节点上的 Keepalived 进程未能正常运行,最终通过优化配置和重启服务解决了该问题。此外,我们还增加了健康检查机制,以提高系统的稳定性和可靠性。 ... [详细]
  • 在C#编程中,设计流畅的用户界面是一项重要的任务。本文分享了实现Fluent界面设计的技巧与方法,特别是通过编写领域特定语言(DSL)来简化字符串操作。我们探讨了如何在不使用`+`符号的情况下,通过方法链式调用来组合字符串,从而提高代码的可读性和维护性。文章还介绍了如何利用静态方法和扩展方法来实现这一目标,并提供了一些实用的示例代码。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
author-avatar
LES--T单身
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有