C语言程序中调用shell去执行代码

最近在学习KVM虚拟机相关知识,想通过C语言来实现在LINUX环境下执行虚拟机的一些操作命令。比如运行C程序,加上KVM需要的参数,就可以实现在C语言程序运行的当前环境下(Linux环境)自动执行KVM命令。找到了一种方法,通过POPEN函数来操作。

1.首先介绍POPEN函数:

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

int pclose ( FILE* stream );

popen()函数通过创建一个管道,调用fork产生一个子进程,来执行一个SHELL来运行命令。这个进程必须由pclose()函数关闭而不是用fclose()函数。pclose函数关闭标准I/O流,等待命令执行结束,然后返回SHELL的终止状态。如果SHELL不能被执行,则PCLOSE()返回的终止状态与shell已执行exit一样。type 参数只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 "r" 则文件指针连接到 command 的标准输出;如果 type 是 "w" 则文件指针连接到 command 的标准输入。command 参数是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用-c 标志,shell 将执行这个命令。popen 的返回值是个标准 I/O 流,必须由 pclose 来终止。前面提到这个流是单向的。所以向这个流写内容相当于写入该命令的标准输入;命令的标准输出和调用 popen 的进程相同。与之相反的,从流中读数据相当于读取命令的标准输出;命令的标准输入和调用 popen 的进程相同。


2.C语言方式可以用%s的方式,输入一些列自定义需要用户输入是参数,采用sprintf函数,格式化输入进去:

#include

int fprintf( FILE *stream, const char *format, ... );

fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件. fprintf()只能和printf()一样工作. fprintf()的返回值是输出的字符数,发生错误时返回一个负值.

if ((in = fopen("\\AUTOEXEC.BAT", "rt")) == NULL)

{

fprintf(stderr, "Cannot open input file.\n");//stderr标准错误,会将信息打印在屏幕上
return 1;

}

【unix】标准输出(设备)文件,对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。在C中,程序执行时,一直处于开启状态。
可能的使用方法有:fprintf(stderr,"error message")
stderr -- 标准错误输出设备
stdout -- 标准输出设备 (printf("..")) 同 stdout。
两者默认向屏幕输出。

比如我们要执行的KVM命令中有需要用户指定一些参数的名称,

sprintf(cmd,"qemu-kvm create -f cow2 %s %s ",argv[1],argv[2]);

我们利用sprintf函数将我们的命令qemu-kvm create -f cow2 %s %s (%s将会把argv[1]和argv[2]的内容替换进去后)写入到字符数组cmd中,这样完成了输入命令的拼接。

我们再利用popen函数来实现在linux环境终端上的执行。


你可能感兴趣的:(C语言程序中调用shell去执行代码)