C与Shell程序的交互
一、C调用shell
C程序调用shell脚本共有三种方式:system()、popen()、exec系列函数
1)system(shell命令或shell脚本路径);
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
返回值:如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果 system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。
2)popen(char *command,char *type)
popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。
返回值:若成功则返回文件指针,否则返回NULL,错误原因存于errno中。注意:在编写具SUID/SGID权限的程序时请尽量避免使用popen(),popen()会继承环境变量,通过环境变量可能会造成系统安全的问题。
该方法将原先标准输入由popen的第一个参数输入,将原先shell的标准输出输出到文件内容。用这个方法可以在C中调用强大的awk、sed等等工具,例如:
FILE * fp;
char buffer[80];
//char CmdLine[]="cat YDJC.txt | awk -F '|' '{print $1}'";
char CmdLine[255]
sprintf(CmdLine,"cat %s | awk -F '|' '{print $1}'",reqfilename);
if((fp=popen(CmdLine,"r"))==NULL)
{
...
}
pclose(fp);
二、shell调用C
该方法确切地说不是调用C程序,而是调用可执行程序。
Shell调用C编译生成的可执行文件,可以由int main(int argc, char * argv[])传入参数, 由main的返回值获得返回信息。
注意argc总归大于等于一,argv[0]为调用其程序的命令,argv[1]~argv[argc]为真正的参数
参考文献
[1]http://ghostvic.cublog.cn
[2]MSDN
[3]http://www.kainatech.com.cn/frame.php?frameon=yes&referer=http%3A//www.kainatech.com.cn/viewthread.php%3Ftid%3D652
一、C调用shell
C程序调用shell脚本共有三种方式:system()、popen()、exec系列函数
1)system(shell命令或shell脚本路径);
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
返回值:如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果 system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。
2)popen(char *command,char *type)
popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。
返回值:若成功则返回文件指针,否则返回NULL,错误原因存于errno中。注意:在编写具SUID/SGID权限的程序时请尽量避免使用popen(),popen()会继承环境变量,通过环境变量可能会造成系统安全的问题。
该方法将原先标准输入由popen的第一个参数输入,将原先shell的标准输出输出到文件内容。用这个方法可以在C中调用强大的awk、sed等等工具,例如:
FILE * fp;
char buffer[80];
//char CmdLine[]="cat YDJC.txt | awk -F '|' '{print $1}'";
char CmdLine[255]
sprintf(CmdLine,"cat %s | awk -F '|' '{print $1}'",reqfilename);
if((fp=popen(CmdLine,"r"))==NULL)
{
...
}
pclose(fp);
二、shell调用C
该方法确切地说不是调用C程序,而是调用可执行程序。
Shell调用C编译生成的可执行文件,可以由int main(int argc, char * argv[])传入参数, 由main的返回值获得返回信息。
注意argc总归大于等于一,argv[0]为调用其程序的命令,argv[1]~argv[argc]为真正的参数
参考文献
[1]http://ghostvic.cublog.cn
[2]MSDN
[3]http://www.kainatech.com.cn/frame.php?frameon=yes&referer=http%3A//www.kainatech.com.cn/viewthread.php%3Ftid%3D652