本文是对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 commandSYNOPSIS
#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 processSYNOPSIS
#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;
}