C程序调用shell脚本共同拥有三种法子 :system()、popen()、exec系列数call_exec1.c。
system() 不用你自己去产生进程。它已经封装了,直接增加自己的命令。
exec 须要你自己 fork 进程,然后exec 自己的命令。
popen() 也能够实现运行你的命令,比system 开销小。
system的使用
int system(const char *cmdstring);
cmdstring是一个字符指针,就是一个包含需要运行的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 来确认履行成功 。
system命令以其简略 高效的作用得到很很广泛的利用。
system函数的一种实现方式:
int system(const char *cmdstring)
{
pid_t pid;
int status;
if (cmdstring == NULL)
{
return (1);
}
if ((pid = fork()) < 0)
{
status = -1;
}
else if (pid == 0)
{
/* 本质上还是execl函数 */
execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
_exit(127);
}
else
{
while (waitpid(pid, &status, 0) < 0)
{
if (errno != EINTR)
{
status = -1;
break;
}
}
}
return(status);
}
popen的使用
常见操作是创建一个连接到另一个进程(shell的命令行)的管道,然后读其输出或向其输入端发送数据。
popen() 会调用fork()产生子历程,然后从子历程中调用/bin/sh -c来履行 參数command的指令。參数type可使用 “r”代表读取。“w”代表写入。遵循此type值,popen()会建立管道连到子历程的标准输出设备或标准输入设备,然后返回一个文件指针。
随后历程便可利用此文件指针来读取子