linux之exec族练习

本文是对exec族的练习,函数详细部分参考: exec优质文章

1.execl。

例子1:创建一个echoarg.C文件,编译命名为echoarg。

int main(int argc,char *argv[])
{
    int i = 0;
    for(i = 0; i < argc; i++)
    {
        printf("argv[%d]: %s\n",i,argv[i]);
    }
    return 0;
}
int main(void)
{
    printf("before execl\n");
    if(execl("./echoarg","echoarg","abc",NULL) == -1)
    {
        printf("execl failed!\n");
        perror("why");
    }
    printf("after execl\n");
    return 0;
}
~         

execl通过文件名echoarg,执行echoarg文件,并传参(abc). 结果如下:

例子2:

int main(void)
{
    printf("before execl\n");
    if(execl("/bin/date","date",NULL,NULL) == -1)
    {
        printf("execl failed!\n");
        perror("why");
    }
    printf("after execl\n");
    return 0;
}

先用whereis date命令查询 date的路径,execl通过date的路径运行date,打印了当前日期。

例子3:

int main(void)
{
    printf("before execl\n");
    if(execl("/bin/ls","ls","-l",NULL) == -1)
    {
        printf("execl failed!\n");
        perror("why");
    }
    printf("after execl\n");
    return 0;
}

execl通过ls的路径运行ls -l的功能。等于在vm敲ls -l的命令。

例子4:

int main(void)
{
    printf("before execl\n");
    if(execlp("date","date",NULL,NULL) == -1)
    {
        printf("execl failed!\n");
        perror("why");
    }
    printf("after execl\n");
    return 0;
}
int main(void)
{
    printf("before execl\n");
        char *argv[] = {"data",NULL,NULL};

    if(execvp("date",argv) == -1)
    {
        printf("execl failed!\n");
        perror("why");
    }
    printf("after execl\n");
    return 0;
}
int main(void)
{
    printf("before execl\n");
        char *argv[] = {"data",NULL,NULL};

    if(execv("/bin/date",argv) == -1)
    {
        printf("execl failed!\n");
        perror("why");
    }
    printf("after execl\n");
    return 0;
}

结论:exec族加了p就不用写绝对路径。 

2.system函数

函数原型: 

NAME
       system - execute a shell command

SYNOPSIS
       #include <stdlib.h>

       int system(const char *command);

system()函数的返回成功,则返回进程的状态值;当sh不能执行时,返回127; 失败返回-1;

例子 

int main(void)
{
    printf("before system\n");
    system("date");
    printf("after system\n");
    return 0;
}

运行结果如下 

before system
Thu Sep 29 19:11:09 CST 2022
after system 

system跟exec族功能一样,但system比较简单。system括号内容(data)等于命令行下的内容(data)。 

3:popen函数

函数原型:  

NAME
       popen, pclose - pipe stream to or from a process

SYNOPSIS
       #include <stdio.h>

       FILE *popen(const char *command, const char *type);

       int pclose(FILE *stream);

作用:该函数可以取到运行的结果。 

 例子

int main(void)
{
    FILE *fp = NULL;
    char buf[10240] = {0};
    fp = popen("ls -al","r");
    fread(buf, 10240, 1, fp);
    printf("%s\n",buf);
    pclose(fp);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值