Linux——进程控制2|进程程序替换|替换原理|替换函数|替换函数创建子进程|其余替换函数介绍|使用替换致函执行其它文件程序|使用替换致函执行其它语言文件|execlp |下

简介: 笔记

使用替换致函执行其它文件程序


创建一个mycmd.c文件

1.png

修改makefile,方便一次生成俩个文件

2.png



这里的all不需要依赖关系,只要依赖方法

3.png

我们现在想用exce来执行mycmd


记住这个路径4.png

5.png


6.png



成功调用了mycmd文件


测试-b命令

7.png



程序运行成功

8.png 也可把程序里面的路径设置为相对路径(用.或..)


使用替换致函执行其它语言文件


创建俩个文件

9.png10.png

测试一下代码

11.png

sh文件

12.png13.png14.png15.png

也可加上执行权限直接运行

16.png

execlp


 最终boss:execle


int execle(const char *path,const char *arg,...,char *const envp[]);

path:路径+文件名


arg:命令行模式下使用格式,命令行参数必须以NULL结尾


envp:环境变量


mycmd.c文件

17.png

我们使用getenv获取环境变量,getenv根据环境变量名获取环境变量

18.png


Come on这个环境变量并不存在,这是我们自己写的

19.png

exec.c文件

20.png



执行这个文件,注意我们没有给函数传环境变量

21.png

我们传一个环境变量

22.png

23.png

我们发现come on打印成功,这是因为再exec.c文件中父进程把环境变量通过execle传给了子进程,子execle函数调用了mycmd.c文件,mycmd.c通过getenv获取到了环境变量Come on


Shell简单实现  


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#define NUM 1024
#define SIZE 32
#define EP " "
char cmd_line[NUM];//保存完整的字符串
char* g_garp[SIZE];//保存打散后的字符串
int main()
{
    while (1)
    {
        printf("[root@localhost myshell]# ");
        fflush(stdout);
        memset(cmd_line, '\0', sizeof cmd_line);
        if (fgets(cmd_line, sizeof cmd_line, stdin) == NULL)
        {
            continue;
        }
        cmd_line[strlen(cmd_line) - 1] = '\0';
        g_garp[0] = strtok(cmd_line, EP);
        int index = 1;//作为打散后要保存字符串的下标
        if (strcmp(g_garp[0], "ls") == 0)
        {
            g_garp[index++] = "--color=auto";
        }
        if (strcmp(g_garp[0], "ll") == 0)
        {
            g_garp[0] = "ls";
            g_garp[index++] = "-l";
            g_garp[index++] = "--color=auto";
        }
        while (g_garp[index++] = strtok(NULL, EP));//分隔字符串,并复制
        if (strcmp(g_garp[0], "cd") == 0)
        {
            if (g_garp[1] != NULL);
            chdir(g_garp[1]);
            continue;
        }
        pid_t id = fork();
        if (id == 0)
        {
            printf("下面子进程要进行的是\n");
            execvp(g_garp[0], g_garp);
            exit(0);
        }
        //父进程获取子进程信息
        int status = 0;
        pid_t ret = waitpid(id, &status, 0);
        if (ret > 0)
            printf("exit code:%d\n", WEXITSTATUS(status));
    }
    return 0;
}

24.png

如果这样打印,没有换行,这是因为我们没有刷新缓冲区


这种情况会自动换行,是因为我们按了回车,多了\n,我们把\n改为\0就行

25.png

输入cd命令没反应

26.png

这里输入cd其实是想让父进程执行自己的命令,这种命令叫内置命令(内建命令)


内建命令本质其实就是shell中的一个函数调用


系统中有一个调用接口chdir,表示更改当前目录

27.png

这里chdir(g_garv[1])//表示切换到数组下标为1的这个路径


chdir函数用于改变当前工作目录。调用参数是指向目录的指针

相关文章
|
3月前
|
存储 数据管理 Linux
区分Linux中.tar文件与.tar.gz文件的不同。
总之,".tar"文件提供了一种方便的文件整理方式,其归档但不压缩的特点适用于快速打包和解压,而".tar.gz"文件通过额外的压缩步骤,尽管处理时间更长,但可以减小文件尺寸,更适合于需要节约存储空间或进行文件传输的场景。用户在选择时应根据具体需求,考虑两种格式各自的优劣。
422 13
|
4月前
|
安全 Linux
Linux赋予文件000权限的恢复技巧
以上这些步骤就像是打开一扇锁住的门,步骤看似简单,但是背后却有着严格的逻辑和规则。切记,在任何时候,变更文件权限都要考虑安全性,不要无谓地放宽权限,那样可能
142 16
|
4月前
|
存储 Linux 数据处理
深入剖析Linux中一切即文件的哲学和重定向的机制
在计算机的奇妙世界中,Linux的这套哲学和机制减少了不同类型资源的处理方式,简化了抽象的概念,并蕴藏着强大的灵活性。就像变戏法一样,轻轻松松地在文件、程序与设备之间转换数据流,标准输入、输出、错误流就在指尖舞动,程序的交互和数据处理因此变得既高效又富有乐趣。
63 4
|
5月前
|
Ubuntu Linux
"unzip"命令解析:Linux下如何处理压缩文件。
总的来说,`unzip`命令是Linux系统下一款实用而方便的ZIP格式文件处理工具。本文通过简明扼要的方式,详细介绍了在各类Linux发行版上安装 `unzip`的方法,以及如何使用 `unzip`命令进行解压、查看和测试ZIP文件。希望本文章能为用户带来实际帮助,提高日常操作的效率。
621 12
|
4月前
|
Linux
linux文件重命名命令
本指南介绍Linux文件重命名方法,包括单文件操作的`mv`命令和批量处理的`rename`命令。`mv`可简单更改文件名并保留扩展名,如`mv old_file.txt new_name.txt`;`rename`支持正则表达式,适用于复杂批量操作,如`rename &#39;s/2023/2024/&#39; *.log`。提供实用技巧如大小写转换、数字序列处理等,并提醒覆盖风险与版本差异,建议使用`-n`参数预览效果。
|
Linux 编译器 Shell
Linux系统下实现QT程序打包发布
Linux系统下实现QT程序打包发布
2168 0
|
27天前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
103 16
|
19天前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
|
3月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
668 13
|
4月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
555 21

热门文章

最新文章