C程序调用shell脚本共有三种法子 :system()、popen()、exec系列数call_exec1.c
system() 不用你自己去产生进程,它已经封装了,直接加入自己的命令。
exec 需要你自己 fork 进程,然后exec 自己的命令。
popen() 也可以实现执行你的命令,比system 开销小。
方法一:system()的使用
system命令以其简略高效的作用得到很很广泛的利用 ,下面是一函数原型。
int system(const char *command);
我在/home/farsight新建一个test.sh文件如下:
#!/bin/bash
echo $HOME
echo "the is test!"
test.c文件如下:
#include<stdlib.h>
int main()
{
system("bash /home/farsight/test.sh");
//system("/home/farsight/test.sh");//【另一种方法】
return 0;
}
执行如下命令来编译:
gcc test.c -o test
测试命令:
./test
结果如下:
the is test!
方法二:popen()使用
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
其他不用改变我们直接修改test.c文件:
#include<stdio.h>
int main()
{
char buffer[80];
FILE *fp=popen("bash /home/farsight/test.sh","r");
fgets(buffer,sizeof(buffer),fp);
printf("%s",buffer);
pclose(fp);
return 0;
}
方法三:exec函数簇
需要注意的是exec并不是1个函数, 其实它只是一组函数的统称, 它包括下面6个函数:
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[];
可以见到这6个函数名字不同, 而且他们用于接受的参数也不同。