返回顶部
首页 > 资讯 > 操作系统 >linux执行ls会引起什么系统调用
  • 320
分享到

linux执行ls会引起什么系统调用

2023-06-29 13:06:39 320人浏览 安东尼
摘要

这篇文章给大家分享的是有关linux执行ls会引起什么系统调用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在linux中,执行ls会引起read和exec系统调用;执行任何一个shell命令都会调用fork和e

这篇文章给大家分享的是有关linux执行ls会引起什么系统调用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

在linux中,执行ls会引起read和exec系统调用;执行任何一个shell命令都会调用fork和exec,但是通过strace去查看ls引起的系统调用并没有fork,ls命令要列出目录下的文件,所以要调用read。

教程操作环境:linux7.3系统、Dell G3电脑。

linux执行ls会引起什么系统调用

答案是read、exec系列

shell命令执行机制就是 fork+exec, fork是分身,execve是变身。ls命令要列出目录下的文件,所以read也会调用。

shell访问Linux内核就是通过fork和exec命令实现的,fork命令创建可以一个相同的线程出来。

通过strace去查看ls引起的系统调用,确实是没有fork,但是因为执行任何一个shell命令都会调用fork

execve的变身就是创建一个新的进程,并用新的进程去替换掉原来的进程。

首先我们讨论一下什么是系统调用(system calls)?
用户借助UNIX/linux直接提供的少量函数可以对文件和设备进行访问和控制,这些函数就是系统调用[1]。

使用strace ls命令我们可以查看ls命令使用到的系统调用[2],其中一部分输出内容如下:

open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3getdents64(3, , 32768)  = 2240getdents64(3, , 32768)   = 0close(3)                                = 0

open系统调用打开当前目录文件,返回获得的文件描述符。可以看到该文件使用O_RDONLY标志打开。

只要该文件是用O_RDONLY或O_RDWR标志打开的,就可以用read()系统调用从该文件中读取字节[3]。

所以ls要用到read系统调用。除此之外,任何shell命令都会创建进程,都会用到exec系统调用。

回过头来梳理一下我们对于这些概念可能产生的疑惑:

  1. 包括ls在内,一个程序是如何运行的?

  2. open系统调用打开当前目录文件,返回获得的文件描述符。那什么是文件描述符?

1 进程是如何运行的

每个运行中的程序被称为进程[1]

Unix将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。当我们创建了一个进程之后,通常将子进程替换成新的进程映象。所以任何shell命令都会创建进程,都会用到exec系统调用。
例如:在shell命令行执行ps命令,实际上是shell进程调用fork复制一个新的子进程,在利用exec系统调用将新产生的子进程完全替换成ps进程。

用exec函数可以把当前进程替换为一个新进程,且新进程与原进程有相同的PID。exec名下是由多个关联函数组成的一个完整系列[4]

调用fork创建新进程后,父进程与子进程几乎一模一样[1,p398]。

fork是一个UNIX术语,当fork一个进程(一个运行中的程序)时,基本上是复制了它,并且fork后的两个进程都从当前执行点继续运行,并且每个进程都有自己的内存副本。

原进程是父进程,新进程是子进程。可以通过fork()返回值区分。

父进程中fork调用返回的是新的子进程的pid(process id),而子进程中fork调用返回的是0

举个例子:

#include<unistd.h>#include<stdio.h>#define LEN 10int main(){    pid_t id=getpid();    printf("Main pid: %d \n",id);int i;pid_t res=fork();if(res==0){  for(i =0;i<LEN;i++)   {pid_t id1=getpid();printf("%d ",id1);printf("Child process:%d\n",i);  }}else{  printf("res %d\n",res);  for(i=0;i<LEN;i++)   {pid_t  id2=getpid();printf("%d ",id2);printf("parent process:%d\n",i);  }}printf("THE END\n"); return 0;}

如果想要程序启动另一程序的执行但自己仍想继续运行的话,怎么办呢?那就是结合fork与exec的使用[6][1, p397]

举个例子(修改自[6]):

#include<string.h> #include <errno.h> #include <stdio.h> #include <stdlib.h>#include<unistd.h>  char command[256]; void main() {    int rtn;     while(1) {              printf( ">" );       fgets( command, 256, stdin );       command[strlen(command)-1] = 0;       if ( fork() == 0 ) {          execlp( command, NULL );                    perror( command );          exit( errno );       }       else {          pid_t sonid=wait ( &rtn );          printf(" child pid: %d\n",sonid);          printf( " child process return %d\n", rtn );       }   }}

先fork,然后子进程借助exec调用程序command。对错误命令、需要参数的命令、以及不需要参数的命令给出对应的输出。

2 文件描述符(file descripter,fd)

一切设备都可以看作文件。

对内核而言,所有打开的文件都通过文件描述符引用[7]。文件描述符是非负整数,范围是[0,OPEN_MAX -1]。现在OPEN_MAX 一般为64

但是[7]又说对于FreeBSD 8.0,Linux 3.2.0 ,Mac OS X 10.6.8等, fd变化范围几乎无限,只受到存储器数量、int字长以及系统管理员所配置的软限制和硬限制的约束。。。why?

当open或者create一个新文件时,内核向进程返回一个文件描述符。

当读、写一个文件时,使用open或create返回的文件描述符标识该文件,将其作为参数传送给read / write

按照惯例,fd为0 / 1 / 2分别关联STDIN_FILENO / STDOUT_FILENO / STDERR_FILENO。这些常量也定义在unistd.h.

3 系统调用包含在哪些头文件中呢?

包括exec、fork、read、write在内,许多系统调用包含在unistd.h头文件中

POSIX,Portable Operating System Interface。是UNIX系统的一个设计标准,很多类UNIX系统也在支持兼容这个标准,如Linux。
unistd.h是POSIX标准定义的unix类系统定义符号常量的头文件,包含了许多UNIX系统服务的函数原型[5]。在该头文件,用于访问设备驱动程序的底层函数(系统调用)有这五个:open/close/read/write/ioctl[1]。

4 文件I/O

[7]中提到大多数文件I/O用到的5个函数为:open/read/write/lseek/close

4.1 函数read

调用read函数从打开文件中读数据。

#include<unistd.h>ssize_t read(int filedes, void *buf, size_t nbytes);

返回值:

成功,读出的字节数;

失败,-1;

遇到文件尾,0

有多种情况可使实际读到的字节数少于要求读的字节数:

  • 读普通文件时,在读到要求字节数之前已经到达了文件尾端。

例如,若在到达文件尾端之前还有30个字节,而要求读100个字节,则read返回30,下一次再调用read时,它将回0。

  • 当从终端设备读时,通常一次最多读一行

  • 当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。

  • 当从管道或FIFO读时,如若管道包含的字节少于所需的数量,那么read将只返回实际可用的字节数。

  • 当从某些面向记录的设备(例如磁盘)读时,一次最多返回一个记录。

  • 当某一信号造成中断,而已经读了部分数据量时。读操作从文件的当前偏移量出开始,在成功返回之前,该偏移量将增加实际独到的字节数

read的经典原型定义则是:

int read(int fd, char*buf, unsigned nbytes);

感谢各位的阅读!关于“linux执行ls会引起什么系统调用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: linux执行ls会引起什么系统调用

本文链接: https://lsjlt.com/news/325073.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • linux执行ls会引起什么系统调用
    这篇文章给大家分享的是有关linux执行ls会引起什么系统调用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在linux中,执行ls会引起read和exec系统调用;执行任何一个shell命令都会调用fork和e...
    99+
    2023-06-29
  • Linux系统怎么执行.exe文件
    小编给大家分享一下Linux系统怎么执行.exe文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!.exe文件是windows中的执行程序。1、安装需要的软件包:...
    99+
    2023-06-28
  • Linux系统怎么执行Shell脚本
    小编给大家分享一下Linux系统怎么执行Shell脚本,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1)bash script-name或者sh script-n...
    99+
    2023-06-28
  • Linux系统中怎么执行python文件
    本篇内容主要讲解“Linux系统中怎么执行python文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux系统中怎么执行python文件”吧!方法:在.py文件的第一行加上下面的任意一行...
    99+
    2023-06-28
  • Python中怎么执行Linux系统命令
    这篇文章将为大家详细讲解有关Python中怎么执行Linux系统命令,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。(1) os.system仅仅在一个子终端运行系统命令,而不能获取命令执行后...
    99+
    2023-06-09
  • linux多个命令一起执行的方法是什么
    在Linux中,可以使用分号(; )来将多个命令串联在一起,使它们一起执行。分号的作用是分隔不同的命令,使其按顺序执行。例如:com...
    99+
    2023-09-15
    linux
  • ls与alias命令怎么在Linux系统中使用
    这篇文章给大家介绍ls与alias命令怎么在Linux系统中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。ls命令作用:列举目录文件信息( list directory content )格式:ls [option...
    99+
    2023-06-09
  • Linux系统怎么查找可执行文件
    这篇文章跟大家分析一下“Linux系统怎么查找可执行文件”。内容详细易懂,对“Linux系统怎么查找可执行文件”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“Linux系统怎么查找...
    99+
    2023-06-28
  • linux中系统调用的概念是什么
    这篇文章主要讲解了“linux中系统调用的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux中系统调用的概念是什么”吧!在linux中,系统调用是指操作系统提供给用户程序调用...
    99+
    2023-06-29
  • 怎么在Linux系统中重复执行命令
    今天就跟大家聊聊有关怎么在Linux系统中重复执行命令,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。普通的重复执行命令实际操操作过程中,经常会遇到重复执行同一命令,以观察其结果变化的...
    99+
    2023-06-13
  • Python怎么执行Linux操作系统的命令
    这篇文章主要讲解了“Python怎么执行Linux操作系统的命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python怎么执行Linux操作系统的命令”吧!在开发运维脚本过程中,经常需要...
    99+
    2023-06-02
  • 服务器租用为什么会运行不起来
    服务器租用无法运行起来可能有多种原因,包括但不限于以下几点: 配置问题:服务器的配置可能不符合您的需求,例如内存、CPU、存储空...
    99+
    2024-04-02
  • Linux系统中怎么使用crontab来定时执行脚本
    本篇内容介绍了“Linux系统中怎么使用crontab来定时执行脚本”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!网友突然问道的,想了很久,...
    99+
    2023-06-13
  • hadoop中系统执行排序的过程叫什么
    这篇文章给大家分享的是有关hadoop中系统执行排序的过程叫什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MapReduce确保每个reducer的输入都是按键排序的,系统执行排序的过程称为shuffle。s...
    99+
    2023-06-14
  • Linux系统有什么用
    这篇文章主要介绍了Linux系统有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。目录树可以分为小的部分,每个部分可以在自己的磁盘或分区上。主要部分是根、/usr 、/v...
    99+
    2023-06-05
  • 在Linux系统中如何使用ls命令按日期对文件进行排序
    ls命令用于列出目录内容,结果可以按几个条件排序,例如按日期,按字母顺序排列的文件名,修改时间,访问时间,版本和文件大小。 在本文中,我将向您展示如何使用linux中的ls命令按日期对文件进行排序。 1)列出具有上次...
    99+
    2022-06-04
    linux ls命令 ls 命令
  • linux调用系统内核函数的方法是什么
    在Linux中,调用系统内核函数的方法主要有以下几种:1. 使用系统调用(system call):系统调用是用户程序通过软中断(软...
    99+
    2023-10-18
    linux
  • linux系统下用.sh文件执行python命令的方法
    目录标准版进阶版1 for循环2 嵌套for循环3 定义变量名4 写if函数总结标准版 假设,在终端要执行的命令是: python main.py 首先在执行目录下创建test.sh(文件名自定义)文件 并在test....
    99+
    2022-07-27
    .sh文件执行命令 Linux运行python shell运行python脚本
  • 如何在 Linux 系统中使用 PHP 执行 Laravel 的路径?
    在 Linux 系统中,使用 PHP 执行 Laravel 的路径是一个常见的问题。本文将为您提供一个详细的指南,帮助您在 Linux 系统中使用 PHP 执行 Laravel 的路径。我们将一步一步地介绍如何配置和使用 Laravel 的...
    99+
    2023-06-13
    path laravel linux
  • Win7系统禁止U盘使用当u盘插入后不会运行起来
      首先,按组合键“Win+R”(Win就是在ctrl和alt中间的键)打开运行,然后输入“regedit.exe”,如下图所示:   按回车键,进入“注册表...
    99+
    2023-06-04
    Win7 禁止U盘使用 系统
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作