当前位置: 首页 > article >正文

day 29 进程exec函数族 ,进程实现无人机模块,exec实现minishell

1.excel函数族与system

当进程调用一种exec函数时,该进程的
用户空间代码和数据完全被新程序替换,无新进程的创建

第一个参数可以是编译后的文件的地址

gcc exec.c -o app
"./app"作为第一个参数,./app作为第二个参数,这样可以替换为自己写的程序
execl("./app", "./app", NULL);

l:参数以列表形式传递
v:参数以指针数组形式传递
p:在系统路径下找要执行的代码

#include <stdio.h>
#include<unistd.h>
int main()
{
    char *arg[] = {"top",NULL};
    execv("/usr/bin/top",arg);//第一个参数是这个命令的所在地址,后面的参数打包在指针数组里面
    execlp("top","top",NULL);//第一个直接写命令就行,不用写准确地址,
    execl("/usr/bin/top","top",NULL);,第一个是地址,后面的要写在控制台输入的指令,空格作为分割,每个都是独立的参数
    execvp("top",arg);
    return 0;
}

system

直接传在终端输入的指令作为参数。创建了新的进程(与exec的区别)system("./app");
使用fork和exec实现system

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
	printf("before system\n");
	pid_t pid = fork();	
	if (pid > 0)
	{
		wait(NULL);
		

	}
	else if (0 == pid)
	{
		execl("./app", "./app", NULL);
	}
	else
	{
		perror("fail fork");
	}

	printf("after system\n");
	return 0;
}

2 .模仿无人机实现以下

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>


int main(int argc,char *argv[])
{
    int i =0;
    pid_t pid = 0; 
    for(i = 0; i<5;++i)
    {
        pid = fork();
        if(pid == 0)//注意这一块,必须判断,让子进程出去
        {
            break;
        }
    }
    if(pid > 0)
    {
        for(int j = 0;j<5;++j)
        {
            wait(NULL);
        }
    }
    else if(0 == pid)
    {
        switch(i)
        {
        case 0:
            while(1)
            {
                printf("主模块正在工作\n");
                sleep(1);
            }
            break;
        case 1:
            while(1)
            {
                printf("图像采集模块正在工作\n");
                sleep(1);
            }
            break;
        case 2:
            while(1)
            {
                printf("图像发送\n");
                sleep(1);
            }
            break;
        case 3:
            while(1)
            {
                printf("命令接收\n");
                sleep(1);
            }
            break;
        case 4:
            while(1)
            {
                printf("命令执行\n");
                sleep(1);
            }
            break;
            

        }
    }
    return 0;
}

3 minishell

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>

void show_cmd_line()
{
    char path[512] = {0};
    getcwd(path,sizeof(path));//获得地址
    fprintf(stdout,"XuHeng@ubuntu:%s$",path);
    fflush(stdout);

    return;
}

void get_user_cmd(char *cmd ,int len)
{
    fgets(cmd ,len ,stdin);
    cmd[strlen(cmd)-1] = '\0';//fgets\n 后有个\0,gets()直接将\n换位\0
    
    return;
}

void strtok_cmd(char *cmd, char **arg)
{
    int i = 0;
        arg[i] = strtok(cmd ," ");//注意用双引号
    while(NULL != arg[i])
    {
        ++i;
        arg[i] = strtok(NULL ," ");//只剩最后一段带\0他会自动分。

    }
    return;
}


int exec_cmd(char **arg)
{
    pid_t pid = fork();
    if(pid>0)
    
    {
        wait(NULL);
    }
    else if(pid == 0)
    {

        execvp(arg[0],arg);//成功无法返回
        printf("fail exec\n");//?
        exit(1);

    }
    return 0;
}

int main(int argc , char *argv[])
{
    char cmd[512] = {0};
    char *arg[512] = {NULL};
    while(1)
    {
        show_cmd_line();
        get_user_cmd(cmd ,sizeof(cmd));
        strtok_cmd(cmd , arg);
        if(0 == strcmp(arg[0],"exit"))
        {
            break;
        }
        else if( 0== strcmp (arg[0] , "cd"))
        {
            chdir(arg[1]);
            continue;

        }
        exec_cmd(arg);

    }
    return 0;
}

http://www.kler.cn/a/461541.html

相关文章:

  • DevOps工程技术价值流:Ansible自动化与Semaphore集成
  • Docker--Docker Container(容器) 之 操作实例
  • Netty学习 - 编译Netty4.2
  • JVM实战—8.如何分析jstat统计来定位GC
  • java接口下载zip,不生成中间文件,返回前端文件流
  • Spring Boot 3 文件下载、多文件下载以及大文件分片下载、文件流处理、批量操作 和 分片技术
  • Ribbon和Eureka的集成
  • 黑神话悟空游戏鼠标光标使用教程与下载
  • 探秘Kafka源码:关键内容解析
  • 【Leetcode 热题 100】22. 括号生成
  • 设计模式-创建型模式-工厂模式
  • 【Git_bugs】remote error GH013 Repository rule violations found for.md
  • 【网络】什么是路由协议(Routing Protocols)?常见的路由协议包括RIP、OSPF、EIGRP和BGP
  • ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)
  • 随笔 | 写在2024的最后一天
  • 线程锁和协程锁的区别
  • Redis Stream:实时数据处理的高效解决方案
  • 2分钟知晓Vscode 插件发布流程
  • 【Rust自学】8.6. HashMap Pt.2:更新HashMap
  • 智能运维分析决策系统:构建高效运维的新篇章
  • 自动化与人工结合:如何平衡效率与风险?
  • 监控 Docker 注册表
  • 基于 Slf4j 和 AOP 的自动化方法执行时间日志记录方案
  • python-Flask:SQLite数据库路径不正确但是成功访问到了数据库,并对表进行了操作
  • QT----------常用界面组件的使用
  • 2024 AI产品经理在大模型的探索与实践(附学习资料下载)