V3.0_用exec族函数替代system()

这篇具有很好参考价值的文章主要介绍了V3.0_用exec族函数替代system()。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注意点:exec族函数的使用

以execl为例:

(1)

V3.0_用exec族函数替代system()

 (2)exec族函数中的函数调用失败时会设置error并返回-1,然后从源程序调用点接着往下执行。
执行成功后不会返回,也不会从源程序调用点接着往下执行。

exec族函数一般配合fork使用;

创建子进程后,在子进程中调用exec组函数处理事情;

exec族函数允许成功后不会返回,也不会继续执行,而是结束子进程,且子进程的结束状态为0(相当于调用exit(0)结束子进程)

 V3.0_用exec族函数替代system()

二,验证“exec族函数允许成功后不会返回,也不会继续执行,而是结束子进程,且子进程的结束状态为0(相当于调用exit(0)结束子进程)”

父进程在等待子进程结束,如果子进程结束了,会打印结束状态;

函数中未使用exit(0);

status_childProcess初值被设置为-1了;

V3.0_用exec族函数替代system()

 V3.0_用exec族函数替代system()

 V3.0_用exec族函数替代system()

 V3.0_用exec族函数替代system()

子进程结束状态为0;

证明execl运行成功后主动结束了子进程;

程序的完整代码:

mainc


#include "./io.h"

struct CMD_input CMD_test1={"creat","copy","display","delete","write"};
struct buffer_param *p;

int main(int argc,char **argv)
{
    //printf("argc :%d,argv[0]:%s,argv[1]:%s,argv[2]:%s\r\n",argc,argv[0],argv[1],argv[2]);
    //agrc指在终端输入的个数
    //argv[0]是第1个参数;
    //argv[1]是第二个参数;,,,,,,
    
    //1-function:解析参数1。判断要做什么操作
    //当前只接解析“creat”,但是预留“cp”,"display","delete"接口
    
    p = ( struct buffer_param *)malloc(sizeof(struct buffer_param));
    memset(p,0,sizeof(struct buffer_param));
    strncpy(p->buffer_param0,argv[0],strlen(argv[0]));
    strncpy(p->buffer_param1,argv[1],strlen(argv[1]));
    strncpy(p->buffer_param2,argv[2],strlen(argv[2]));
    if(argc==4)
    {
        strncpy(p->buffer_param3,argv[3],strlen(argv[3]));
    }
    


    log_test1();//打印所有参数
    read_CMD();//读取指令“creat,write,delete,display,copy”
    task_sch();//执行任务




    return 0;
}





io.c

#include "./io.h"
extern struct buffer_param *p;
extern struct CMD_input CMD_test1;
int flag_of_QUITEDIT=0;
char path_of_file[30];
char flag_of_key_event=0;

void log_test1()
{
    printf("param0:%s\r\n",p->buffer_param0);
    printf("param1:%s\r\n",p->buffer_param1);
    printf("param2:%s\r\n",p->buffer_param2);
    printf("param3:%s\r\n",p->buffer_param3);
}
int read_CMD()
{
    if(strncmp(p->buffer_param1,CMD_test1.CMD_CREAT,strlen(p->buffer_param1))==0)//creat
    {
        memset(path_of_file,0,sizeof(path_of_file));
        sprintf(path_of_file,"./%s",p->buffer_param2);
        flag_of_key_event = Key_event_creatFile;
        //creat(buffer_param2, S_IRWXU);
    }
    else if(strncmp(p->buffer_param1,CMD_test1.CMD_WRITE,strlen(p->buffer_param1))==0)//write
    {
        memset(path_of_file,0,sizeof(path_of_file));
        sprintf(path_of_file,"./%s",p->buffer_param2);
        flag_of_key_event = Key_event_writeFile;///写入数据
    }    
    else if(strncmp(p->buffer_param1,CMD_test1.CMD_DISPLAY,strlen(p->buffer_param1))==0)//display
    {
        memset(path_of_file,0,sizeof(path_of_file));
        sprintf(path_of_file,"cat ./%s",p->buffer_param2);
        flag_of_key_event = Key_event_displayFile;///
    } 
    else if(strncmp(p->buffer_param1,CMD_test1.CMD_CP,strlen(p->buffer_param1))==0)//copy
    {
        memset(path_of_file,0,sizeof(path_of_file));
        sprintf(path_of_file,"cp ./%s ./%s",p->buffer_param2,p->buffer_param3);
        flag_of_key_event = Key_event_copyFile;///
    } 
    else if(strncmp(p->buffer_param1,CMD_test1.CMD_DELETA,strlen(p->buffer_param1))==0)//display
    {
        memset(path_of_file,0,sizeof(path_of_file));
        sprintf(path_of_file,"rm ./%s",p->buffer_param2);
        flag_of_key_event = Key_event_deleteFile;///
    } 
    return 0;
}

int task_sch()
{
    int return_of_fork;
    int status_childProcess;//子进程退出状态
    switch(flag_of_key_event)
    {
        case Key_event_creatFile:
                return_of_fork = fork();//创建1个子进程
                if(return_of_fork<0)
                    printf("creat childprocess failed\r\n");
                else if(return_of_fork==0)
                    creat_file();
                else if(return_of_fork>0)
                    wait(NULL);
            break;
        case Key_event_writeFile:
                return_of_fork = fork();//创建1个子进程
                if(return_of_fork<0)
                    printf("creat childprocess failed\r\n");
                else if(return_of_fork==0)
                    write_file();
                else if(return_of_fork>0)
                    wait(&status_childProcess);
                    printf("child process exit status:%d\n",WEXITSTATUS(status_childProcess));
            break;
        case Key_event_displayFile:            
                return_of_fork = fork();//创建1个子进程
                if(return_of_fork<0)
                    printf("creat childprocess failed\r\n");
                else if(return_of_fork==0)
                    display_file();
                else if(return_of_fork>0)
                    wait(&status_childProcess);
                    printf("child process exit status:%d\n",WEXITSTATUS(status_childProcess));
            break;
        case Key_event_copyFile:
                return_of_fork = fork();//创建1个子进程
                if(return_of_fork<0)
                    printf("creat childprocess failed\r\n");
                else if(return_of_fork==0)
                    copy_file();
                else if(return_of_fork>0)
                    wait(&status_childProcess);
                    printf("child process exit status:%d\n",WEXITSTATUS(status_childProcess));

            break;
        case Key_event_deleteFile:
                return_of_fork = fork();//创建1个子进程
                if(return_of_fork<0)
                    printf("creat childprocess failed\r\n");
                else if(return_of_fork==0)
                    delete_file();
                else if(return_of_fork>0)
                    wait(&status_childProcess);
                    printf("child process exit status:%d\n",WEXITSTATUS(status_childProcess));
            break;            
        default :break;
    }
}

int creat_file()
{
    int ret=0;
    ret = creat(p->buffer_param2, S_IRWXU);//
    if(ret==-1)
    {
        printf("creat file failed\r\n");
    }
    exit(Key_event_creatFile);//退出子进程
    return ret;

}


int write_file()
{
    int ret=0;
    int fd=0;
    char readbuffer[128]={0};
    fd = open(path_of_file,O_RDWR | O_CREAT,0666) ;
    if(fd == -1)
	{
		printf("unexist %s\n",path_of_file);
	}	
	else
	{
		printf("open file1 success\n");
        printf("if you want exit edit ,please input “QUIT”\r\n");
        printf("please input string :\r\n");

        while(flag_of_QUITEDIT==0)
        {

            printf(">");
            memset(readbuffer,0,sizeof(readbuffer));
            fgets(&readbuffer[0],50,stdin);
            
            if(strncmp(readbuffer,"QUIT",strlen("QUIT"))==0)
            {
                flag_of_QUITEDIT=1;
            }
            //add"enter"to string
            {
                int len;
                len = strlen(readbuffer);
                readbuffer[len] = '\n';
                readbuffer[len+1] = '\0';
            }

            
            ret = write(fd,readbuffer,strlen(readbuffer));
            if(ret == -1)
            {
                perror("write");
                exit(-1);
            }
            if(flag_of_QUITEDIT==1)
            {
                close(fd);
                exit(Key_event_writeFile);
            }
        }

        }
}


int display_file()
{
    int fd=0;
    //fd = system(path_of_file);
    //printf("fd = %d\r\n",fd);
    fd = execl_for_cat();
    if(fd>0)
    {
        printf("cat file failed\r\n");
    }
    close(fd);
    //exit(Key_event_displayFile);
}

int copy_file()
{
    int fd=0;
    int fdSRC=0;
    int fdDES=0;
    char *readBuf = NULL;
    //fd = system(path_of_file);
    //printf("fd = %d\r\n",fd);
    //使用lseek实现copy;源文件:p->buffer_param2;目标文件:p->buffer_param3
    fdSRC = open(p->buffer_param2,O_RDWR);//打开文件
    if(fdSRC==-1)
    {
        printf("src open failed\r\n");
    }
    else{
        //源文件打开成功
        int size = lseek(fdSRC,0,SEEK_END);//读取文件大小
        lseek(fdSRC,0,SEEK_SET);//把光标移动到文件头部
        readBuf = (char *)malloc(sizeof(char)*size + 8);//指针指向这么大的空间
        int n_read = read(fdSRC, readBuf, 1024);//把源文件的数据读取到buffer中

        fdDES = open(p->buffer_param3,O_RDWR|O_CREAT,0600);//创建目标文件
        int n_write = write( fdDES,readBuf,strlen(readBuf));//向目标文件写入信息
        close(fdSRC);
	    close(fdDES);
 	    exit(Key_event_copyFile);
    }


    
}


int delete_file()
{
    int fd=0;
    fd = system(path_of_file);
    //printf("fd = %d\r\n",fd);
    if(fd!=0)
    {
        printf("delete file failed\r\n");
    }
    exit(Key_event_deleteFile);
}


int execl_for_cat()
{
    memset(path_of_file,0,sizeof(path_of_file));
    sprintf(path_of_file,"./%s",p->buffer_param2);
    printf("will display file by execl \r\n");
    if(execl("/bin/cat","cat",path_of_file,NULL) == -1)//exec族函数中的函数调用失败时会设置error并返回-1,然后从源程序调用点接着往下执行。执行成功后不会返回,也不会从源程序调用点接着往下执行。
	{
		printf("exec failed\n");
	}
    //return 0;
}

io.h文章来源地址https://www.toymoban.com/news/detail-463713.html

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
#define Key_event_creatFile 0x01
#define Key_event_writeFile 0x02
#define Key_event_displayFile 0x03
#define Key_event_copyFile 0x04
#define Key_event_deleteFile 0x05
struct CMD_input{
    char CMD_CREAT[10];
    char CMD_CP[10];
    char CMD_DISPLAY[10];
    char CMD_DELETA[10];
    char CMD_WRITE[10];
};

struct buffer_param{
    char buffer_param0[10];
    char buffer_param1[10];
    char buffer_param2[10];
    char buffer_param3[10];
};
void log_test1();
int read_CMD();
int task_sch();
int creat_file();
int write_file();
int display_file();
int copy_file();
int delete_file();
int execl_for_cat();

到了这里,关于V3.0_用exec族函数替代system()的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux中并发程序设计(进程的创建和回收、exec函数使用)

    概念 程序 存放在磁盘上的指令和数据的有序集合(文件) 静态的 进程 执行一个程序所分配的资源的总称 动态的 进程和程序比较 注:进程是存在RAM中,程序是存放在ROM(flash)中的 进程内容 BSS段:存放程序中未初始化的全局变量 数据段:已初始化的全局变量,static声明的变

    2024年01月25日
    浏览(49)
  • 《Linux操作系统编程》 第六章 Linux中的进程监控: fork函数的使用,以及父子进程间的关系,掌握exec系列函数

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月11日
    浏览(37)
  • 使用element实现导入execl表格的功能

    现如今后台管理项目中越来越人性化,文件上传,文件的下载(主页中都有)表格的导入和导出。 今天给大家搞个前后端联调的导入表格的功能,废话不多说,咱直接上代码吧!!!! 代码后面有对代码的解析,方便大家根据自己的需求进行行对的调整。 2。通过第三方插件

    2024年01月25日
    浏览(28)
  • python的exec函数

    exec() 是 Python 内置的一个函数,用于在运行时执行动态生成的 Python 代码。它以字符串形式接收一个代码块,并将其编译并执行为可执行的 Python 代码。 exec() 函数的语法如下: object :必需,表示要执行的代码块。它可以是以下类型之一: 字符串:包含要执行的 Python 代码的

    2024年02月10日
    浏览(31)
  • Python-VBA函数之旅-exec函数

    目录 一、exec函数的常见应用场景: 二、exec函数安全使用注意事项: 三、exec函数与eval函数对比分析: 1、exec函数: 1-1、Python: 1-2、VBA: 2、相关文章: 个人主页:神奇夜光杯-CSDN博客  一、exec函数的常见应用场景:         exec函数 在Python中有多种实际应用场景,尽管

    2024年04月25日
    浏览(36)
  • 进程的程序替换(exec函数)【Linux】

      进程的程序替换就是让子进程执行新程序, 执行全新的代码和数据,不再和父进程有瓜葛。 替换原理   用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程

    2024年02月02日
    浏览(48)
  • 为什么使用ioutil.ReadAll 函数需要注意

    当我们需要将数据一次性加载到内存中, ioutil.ReadAll 函数是一个方便的选择,但是 ioutil.ReadAll 的使用是需要注意的。 在这篇文章中,我们将首先对 ioutil.ReadAll 函数进行基本介绍,之后会介绍其存在的问题,以及引起该问题的原因,最后给出了 ioutil.ReadAll 函数的替代操作。

    2024年02月13日
    浏览(50)
  • STM32使用printf函数的步骤和注意事项

    1,在KEIL中勾选 Use MicroLIB . 即使用微库. 2, 在代码中添加 如下代码 (目的是为了调用stdio库中的print 函数) 3,在uart.c 填加如下代码 (目的是为了重定向 stdio库中的print 函数 ) 1, 在代码中添加 如下代码 (目的是为了调用stdio库中的print 函数) 2, 关闭半主机模式,并重定向printf 想要明白

    2023年04月08日
    浏览(59)
  • Python 内置函数 :eval、exec、hash、help、callable

    功能描述:“剥去字符串的外衣”,去运行字符串里面的代码 作用 : (1)参数是一个类似\\\"1+3\\\"这样数学表达式的字符串,可以计算得到返回值(int型) (2)参数是一个类似\\\"{\\\'name\\\':\\\'tian\\\',\\\'age\\\':18}\\\"这样字典、列表、元组外套上一对引号的字符串,可以快速得到字典、列表、元组

    2024年02月16日
    浏览(37)
  • 使用Hook拦截socket函数解决虚拟局域网部分游戏联机找不到房间的问题——以文明6为例

    许多单机游戏都有局域网联机功能,尽管有些也提供了互联网联机功能,但是一般这些游戏的土豆服务器让玩家非常恼火,于是诸如游侠等对战平台则是其中一种选择。使用这些平台提供的局域网联机功能就可以获得比较稳定的联机体验。还有一种方法就是搭建虚拟局域网

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包