Linux-c语⾔调⽤shell命令C程序调⽤shell脚本共有三种法⼦:system()、popen()、exec系列数call_exec1.c,
system() 不⽤你⾃⼰去产⽣进程,它已经封装了,直接加⼊⾃⼰的命令
exec 需要你⾃⼰ fork 进程,然后exec ⾃⼰的命令
popen() 也可以实现执⾏你的命令,⽐system 开销⼩
1、system(执⾏shell 命令)
相关函数 fork,execve,waitpid,popen
linux命令及shell编写表头⽂件 #include<stdlib.h>
定义函数 int system(const char * string);
函数说明 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 来确认执⾏成功。
附加说明在编写具有SUID/SGID权限的程序时请勿使⽤system(),system()会
继承环境变量,通过环境变量可能会造成系统安全的问题。
范例:
代码如下:
#include<stdlib.h>
main(){
system(“ls -al /home/z/work”);
system("ifconfig")
}
2、popen(建⽴管道I/O)
相关函数 pipe,mkfifo,pclose,fork,system,fopen
表头⽂件 #include<stdio.h>
定义函数 FILE * popen( const char * command,const char * type);
函数说明 popen()会调⽤fork()产⽣⼦进程,然后从⼦进程中调⽤/bin/sh -c
来执⾏参数command的指令。参数type可使⽤“r”代表读取,“w”
代表写⼊。依照此type值,popen()会建⽴管道连到⼦进程的标准输
出设备或标准输⼊设备,然后返回⼀个⽂件指针。随后进程便可利
⽤此⽂件指针来读取⼦进程的输出设备或是写⼊到⼦进程的标准输
⼊设备中。此外,所有使⽤⽂件指针(FILE*)操作的函数也都可以使
⽤,除了fclose()以外。
返回值 若成功则返回⽂件指针,否则返回NULL,错误原因存于errno中。
错误代码 EINVAL参数type不合法。
注意事项 在编写具SUID/SGID权限的程序时请尽量避免使⽤popen(),popen()
会继承环境变量,通过环境变量可能会造成系统安全的问题。
范例:
代码如下:
#include<stdio.h>
main()
{
FILE * fp;
char buffer[80];
fp=popen(“cat /etc/passwd”,”r”);
fgets(buffer,sizeof(buffer),fp);
printf(“%s”,buffer);
fp=popen("ifconfig","w");
pclose(fp);
}
执⾏ root :x:0 0: root: /root: /bin/bash
3、使⽤vfork()新建⼦进程,然后调⽤exec函数族
代码如下:
#include<unistd.h>
main()
{
char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) };
if(vfork() = =0)
{
execv(“/bin/ls”,argv);
}else{
printf(“This is the parent process\n”);
}
亲测实例:
#include <stdlib.h>
#include <stdio.h>
/*
//system() success
int main()
{
system("ifconfig");
system("ls -al /home/z/work");
return 1;
}*/
/*
//popen() success
int main()
{
FILE* fp;
char buffer[80];
fp=popen("ifconfig","w");
//fp=popen("bash /home/book/shell/test.sh","r");
//fp=popen("~/home/test.sh","r");
pclose(fp);
return 0;
}*/
makefile:
all:
gcc *.c -o c_add_shell

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。