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个函数名字不同, 而且他们用于接受的参数也不同。