首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

极简shell制作

文件 和 C的源文件: touch makefile#或者 Makefile touch myshell.c#其他名字都行,后缀是.c即可   因为我们构建的是C语言项目,所以makefile内文件配置也很简单...自定义Shell编写 ✈️命令行解释器   首先,我们根据常用的shell行为分析:   常用 shell 都有叫做 命令行解释器 的东西(上图红框),而命令行解释器其实就是 由不同的字符串所构成 的,...,有时候有一个选项,有时候没有选项,而shell会根据不同的选项来执行不同的动作。   ...其中只有cd 是不带空格的,其行为是:   如果cd 不带任何选项,那么其行为就是 切换到家目录。...export命令处理   当我们在 自定义 Shell 中导入一个新的环境变量时,也是由子进程进行程序替换完成这件事的,所以,当我们使用hell进行env时,是看不到导入的环境变量的:   所以,export

14310

【Linux】进程程序替换

想要弄明白为什么要有进程程序替换,我们首先要知道父进程创建子进程的目的是什么?想要子进程完成什么样的任务? 想让子进程执行父进程代码的一部分。...程序替换的原理就是:把物理内存中原来的代码和数据替换成目标程序的代码和数据,也就是说:调用execl之后的代码和数据都被替换掉了,有可能还要发生映射关系的改变。...2.多进程 在理解单进程程序替换的基础上,多进程的程序替换就容易理解了。 我们先要达成一个共识:写时拷贝这种机制,不仅仅是对数据,对代码也有写时拷贝策略。...详解如下: 1.execlp 程序替换类函数的函数名称共同部分为:exec。然后后面再加不同的字母,显然这些字母代表着不同的含义: l:list。表示将参数逐个传入。 p:path。...四.如何利用程序替换函数调用自己写的程序 我们自己写的程序也是可执行程序,理论上也是可以使用程序替换函数进程程序替换的。

10410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【linux】进度条

    因为接下来代码调用 sleep(3) 而没有刷新缓冲区,所以在大多数情况下,您在终端上可能看不到立即的输出。 直到程序退出或缓冲区被手动刷新,“hello Makefile!” 的内容才会显示。...如果你希望在没有换行符的情况下立即刷新输出缓冲区,可以在 printf 后调用 fflush(stdout): 修改后的代码块2: #include #include <unistd.h...终端显示: hello Makefile! (暂停3秒钟) 带有换行符 \n 的 printf 在行缓冲模式下会立即刷新到终端。...没有换行符的 printf 可能不会立即刷新缓冲区,需要手动调用 fflush(stdout) 。...这些现象主要源于终端缓冲机制的行为,在不同开发和调试环境中(特别是高速输出场景下)理解这些机制尤其有用。

    8710

    【Linux】探索进程控制奥秘,解锁高效实战技巧

    1.进程创建 1.1字符串常量为什么不可以修改? 这里为什么编译不通过? 因为字符串具有常量属性,字符常量不可被修改。这里的问题是字符串为什么会有常量属性呢?...pid 1.5.写时拷贝: 为什么要用拷贝的形式,父进程直接将资源给子进程不就行了吗?...页表不仅仅有将虚拟地址转换为物理内存,还会有权限位 1.7.fork常规用法 一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如,父进程等待客户端请求,生成子进程来处理请求。...一个进程要执行一个不同的程序。...因为进程具有独立性,我们将子进程进行替换,发生写时拷贝,不会影响父进程 一次想生成两个可执行文件,就需要这么写,不然makefile默认值生成第一条指令!

    5110

    盛弘电气2021秋招笔试题

    笔试时间:2020.09.16,60分钟 宣讲会后直接笔试,若通过会有两轮面试,7-15天出结果。 题型:简答题8道,每题5分,共40分。编程题4道,每题15分,共60分。...1、 insmod module 2、 驱动module的初始化(初始化结束后即进入“潜伏”状态,直到有系统调用) 3、 当操作设备时,即有系统调用时,调用驱动module提供的各个服务函数 4、 rmmod...为什么?...=%lf",n,sum); printf("\n"); return 0; } 2、请写一个单例模式(C++)。...3、是否对Linux下的编译有了解,如果有请写一个编译命令(编译文件为:Hello.cpp),是否对makefile有了解,如果有请写一个简单的Makefile脚本。 4、写一个代码,产生一个线程。

    1.2K30

    Linux:进程控制(二.详细讲解进程程序替换)

    通过地址空间替换,进程可以在运行时动态地加载并执行不同的程序,从而实现灵活的程序执行和管理。 exec 函数族:exec 函数族是一组系统调用,用于执行程序替换操作。...1.2原理 当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换 替换完成后,控制权将转移到新程序的入口点,开始执行新程序的代码。...因为被替换掉了,这也是什么代码没有输出execl end的原因了 exec函数调用成功,那么它实际上不会有返回值;调用失败,它会返回-1 exec函数不会创建新的进程。...把数据从一个硬件搬到另一个硬件,只有操作系统能做 2.多进程时的程序替换 我们可以创建一个子进程,由子进程来进行程序替换,父进程来等待结果就可以。为什么?...,而不会因为同名的文件或目录的存在而跳过这些命令 运行 make 命令时(没有指定具体目标),make 会首先查找 Makefile 中的第一个目标,并尝试构建它。

    22110

    Linux设备驱动程序(二)——建立和运行模块

    printk 函数在 Linux 内核中定义并且对模块可用;它与标准 C 库函数 printf 的行为相似。...一旦发现内核源码树,makefile 调用 default: 目标,来运行第 2 个 make 命令( 在 makefile 里参数化成 $(MAKE)) 象前面描述过的一样来调用内核建立系统,在第 2...一个应用程序可以调用它没有定义的函数:连接阶段使用合适的函数库解决了外部引用。 printf 是一个这种可调用的函数并且在 libc 里面定义。...且这种保护功能分为不同级别,当 cpu 中存在多个级别时,unix 通常使用最高级和最低级,即:超级用户级和用户级,也即内核空间和用户空间。...更不好的是,如果驱动已被交换到硬盘,响应时间会长到不可接受,使用 mlock 系统调用可能会有帮助,但是常常的你将需要锁住许多内存页,因为一个用户空间程序依赖大量的库代码,mlock 也限制在授权用户上

    90841

    【Linux修炼】9.环境变量

    环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。 2. 为什么会有环境变量?...而环境变量具有全局属性,也就是说环境变量本来就是定义给bash的,但是bash的环境变量会被子进程继承下去(为什么要继承,为了不同的应用场景 ——让bash帮我找指令路径,身份认证),也就是说子进程能够使用...预备工作: 在演示之前,我们要对其进行准备工作,也就是设置一下Makefile以及程序的代码: Makefile: 在这里,我们可以通过脚本语言来改变之前的代码风格,即第一个后的@代表生成的mycmd...执行: 我们可以发现,所打印的结果,就是对应的命令行中的命令以及选项,因此我们也知道了为什么叫做命令行参数: 但main函数是程序的入口,那么是谁调用了main函数呢?...事实上这些都是shell和操作系统所做出的行为。因此有的编译器中没有并不是真的没有,而是隐藏在相关的位置,操作系统同样会通过命令行参数去通过命令调用这个程序。

    1.3K00

    手把手教你写一个 Makefile 文件

    第一时间看干货文章 1 如果我们是在Linux下开发,那Makefile肯定要知道,不懂Makefile,面对较大的工程项目的时候就会比较麻烦,懂得利用开发工具将会大大提高我们的开发效率,也可以说Makefile...一、了解什么是 Makefile 一个大型工程中的源文件不计其数,各个功能或者模块分别放在不同的目录下,手动敲命令去编译就带来很大的麻烦,那么Makefile可以定义一系列的编译规则,哪些文件需要先编译...可见,Makefile都成为了一种在工程方面的编译方法。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在 “文件依赖性” 上做文章。...如果执行make出现如下信息,那就是你的代码没有修改过,Makefile拒绝你的请求: 这里还会有一种情况就是如果只修改过其中一个文件,那么重新编译就可以看到只编译修改的那个文件,没有编译其他未修改的文件...会试图去自动推导产生这些目标的依赖和生成命令,这个行为就是隐含规则的自动推导。

    1.6K10

    makefile从入门到放弃——博主吐血整理的笔记

    文件: $ make #默认生成第一个文件 $ make '目标名'#选择性的编译 当工程中的文件名和makefile中的目标重名时,就会有伪目标。...其与C/C++所不同的是,你可以在Makefile中改变其值。在makefile中,变量可以使用在“目标”,“依赖目标”, “命令”或是Makefile的其它部分中。...,但是不执行这些命令 -p 显示make变量数据库的隐含规则 -s 在执行命令时不显示命令 -w 如果执行make在执行过程中改变目录,打印当前目录名 当然makefile也可以像C语言一样调用其他的...makefile的VPATH VPATH:虚路径 在一些大的工程中,有大量的源文件,我们通常的做法是把许多的源文件分类,并且存放在不同的目录下。...如果执行总控 Makefile 时,make 命令带有参数或者在上层的 Makefile 中定义了这个变量,那么 MAKEFLAGS 变量的值将会是 make 命令传递的参数,并且会传递到下层的 Makefile

    1.7K20

    Makefile从入门到上手

    make 会自动寻找规则里需要的材料文件,执行规则下面的行为生成规则中的目标。...比如,待删除文件集合是 5 个,已经手动删除了 1 个,就只剩下 4 个,然而删除命令里面还是 5 个的集合,就会有删除不存在文件的问题,不加这 - ,就会报错,告诉你有一个文件找不到。...还有一个扩展就是,编译时的参数, -g,-Wall 这些,可以放在 makefile 里面 修改后 makefile 如下: Makefile 第十版 src = $(wildcard *.c) #...可以看到 A 的值为空,B 的值为 abc,因为 A 为即时变量,在定义时即确定,所以为空 修改 Makefile 将 C 的赋值放在最后: A := $(C) B = $(C) #C = abc...为函数的参数,参数间以逗号 , 分隔,而函数名和参数之间以“空格”分隔。函数调用以 $ 开头,以圆括号或花括号把函数名和参数括起。

    40630

    【在Linux世界中追寻伟大的One Piece】信号捕捉|阻塞信号

    被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。 注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。...内核决定返回用户态后不是恢复main函数的上下文继续执行,而是执行sighandler函数,sighandler和main函数使用不同的堆栈空间,它们之间不存在调用和被调用的关系,是两个独立的控制流程。...如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。...像上例这样,insert函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数,这称为重入,insert函数访问一个全局链表,有可能因为重入而造成错乱,像这样的函数称为不可重入函数,反之...想一下,为什么两个不同的控制流程调用同一个函数,访问它的同一个局部变量或参数就不会造成错乱?

    8410

    【Linux修炼】11.进程的创建、终止、等待、程序替换

    任意地方调用 exit(code)退出 code为退出码,下面就演示一下: 结果显而易见,当我们查看这个进程是如何结束的,直接观察退出码: 此外,在函数内部exit时,进程也会直接结束,函数也不会有返回值...但是我们发现第一个printf打印出来了,但是execl后面的printf却没有打印出来,这是为什么呢?...通过下面理解: 4.2 理解原理(是什么、为什么、怎么办) 当我们执行代码时,就会创建进程地址空间与物理内存磁盘之间形成映射关系,当执行上面的代码时就是这样,执行第一个printf会照常打印,到了execl...函数时,就会发生进程的程序替换,也就是说,我们所编写的代码会被我们调用的execl对应磁盘内部的代码覆盖,即将指定程序的代码和数据覆盖自己的代码和数据,执行这个新的代码和数据,所以我们明白了为什么execl...而exec系列的函数调用成功是没有返回值的,也不需要返回值,因为进程被替换之候原本的代码就没有意义了,即便返回了一个值,也不会有什么作用,还会有额外的开销。

    6.2K00

    6_Makefile与GCC

    其中: ​ gcc是在x86架构指令用的。 ​ arm-linux- gcc是RSIC(精简指令集)ARM架构上面使用。 ​ 他们会把源程序编译出不同的汇编指令然后生成不同平台的可执行文件。...("%d ask\n",100); return 0; } 你会发现头文件被展开和printf函数中调用HUNDRED这个宏被展开。 ​...注意:在命令行中,静态库夹在的库必须位于调用该库的目标文件之后。 6.2.2.4 代码优化选项 ​ gcc提供几种不同级别的代码优化方案,分别是0,1,2,3和s级,用-Olevel选项表示。.../output 20 40 6.4 Makefile的引入及规则 6.4.1 为什么需要Makefile? ​ 在上一章节对GCC编译器描述,以及如何进行C源程序编译。...为什么clean下的命令没有被执行?这是因为Makefile中定义的只执行命令的目标与工作目录下的实际文件出现名字冲突。

    3.6K10

    【Linux系统编程】八、进程程序替换

    以前我们说数据是可写的,代码是不可写的,现在看来,确实如此。但是接下来要把其它程序的代码通过进程替换放在内存里让子进程与之关联,此时就要给代码进行写时拷贝。...99% 的情况是对数据进行写时拷贝,1% 的情况是代码依旧是只读,本质就是对父进程不可写,子进程后续调用某些系统调用,实际给子进程重新开辟空间把新进程的代码加载,不让子进程执行父进程的代码(其实也是因为新程序的代码覆盖了子进程的代码...用 fork 创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支), 子进程往往要调用一种 exec 函数以执行另一个程序。...当进程调用一种 exec 函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行(也就是说替换后原进程后面的代码就被覆盖了,不会再被执行)。...\n"); return 0; } ​ 执行结果: ⑥ 不同语言之间的相互调用 ​ 程序替换可以调用任何后端语言对应的可执行文件! ​

    4400

    【Linux】--- Linux编译器-gccg++、调试器-gdb、项目自动化构建工具-makeMakefile 使用

    那么为什么会有这些过程呢? 这就要说到编程语言的历史了。最初的计算机只能处理二进制,二进制是处理器的“母语”。这叫“机器语言”或者“机器码”。...那为什么不直接将c语言转为二进制目标文件呢?因为前人已经写好了汇编的编译器,我们只需站在巨人的肩膀上,再将高级语言转为较简单的汇编代码即可。 那么如何形成第一个汇编写的汇编编译器呢?...1.3 链接 – 动静态链接特点及区别 我们的C程序中,并没有定义"printf"的函数实现,且在预编译中包含的"stdio.h"中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实"printf..."printf"了,而这也就是链接的作用。...make程序会读取makefile文件中的数据,然后根据规则调用编译器,汇编器,链接器产生最后的输出。 Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。1.

    43220

    Makefile学习1

    有的规则可能无目标依赖,仅仅是为了实现某种操作,如下面的clean命令: clean: rm -f a.out hello.o 使用make clean命令清理编译的文件时,会调用这个规则中的命令...默认目标 一个Makefile文件里通常会有多个目标,一般会选择第一个作为默认目标。 正常情况下,当你想编译生成a.out时,要使用make a.out命令。...而val_b则不同,因为是延迟展开变量,所以,当make解析到 = 符号时,并没有立即把(b)的值赋值给val_b,而是在运行echo命令时才对其展开,因为此时b的值已经是20,所以(val_b)的值是...当一个追加变量在定义时使用了override,后续对它的值进行追加时,也需要使用带有override指示符的追加方式。否则对此变量值的追加不会有效。...递归执行 在实际工程项目中,各个源文件通常存放在各个不同的目录中,make在编译工程项目时,会依次遍历各个不同的子目录,编译每个子目录下的源文件。

    39510

    C语言令人抓狂的一面——全局变量

    而变量a都是弱符号,所以只选择一个(按照目标文件链接时的顺序)。 事实上,这种规则是C语言里的一个大坑,编译器对这种全局变量多重定义的“纵容”很可能会无端修改某个变量,导致程序不确定行为。...个人认为可以这样解释,fork创建新进程时,子进程获得了父进程上下文“镜像”(自然包括全局变量),虚拟地址相同但属于不同的进程空间,而且此时真正映射的物理地址中只有一份拷贝,所以b的值是相同的(都是2)...随后子进程对b改写,触发了操作系统的**写时拷贝(copy on write)**机制,这时物理内存中才产生真正的两份拷贝,分别映射到不同进程空间的虚拟地址上,但虚拟地址的值本身仍然不变,这对于应用程序来说是透明的...还有一点值得注意,这个示例编译时没有出现第一个示例的警告,即对变量b的sizeof决议,笔者也不知道为什么,或许是GCC的一个bug?...眼尖的读者发现,这次foo.c是作为动态链接库运行时加载的,当t1第一次调用t2时,libfoo.so还未加载,一旦调用了foo函数,b立马中弹,而且c的地址居然还相邻着b,这使得c一同中弹了。

    85910
    领券