加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

执行shell命令的函数――system()、popen()

发布时间:2020-12-15 16:39:14 所属栏目:安全 来源:网络整理
导读:1、FILE* popen(const char* cmd,const char* type); int pclose(FILE* stream); popen()函数fork()一个子进程,创建管道用于父子进程间通信,父进程要么从管道读,要么往管道写,执行一个shell以运行命令来开启一个进程 相比于system()的又是在于使用简单,

1、FILE* popen(const char* cmd,const char* type);

int pclose(FILE* stream);

popen()函数fork()一个子进程,创建管道用于父子进程间通信,父进程要么从管道读,要么往管道写,执行一个shell以运行命令来开启一个进程

相比于system()的又是在于使用简单,popen()只返回两个值,成功返回子进程的status,失败返回-1



2、int system(const char* cmd);

处理了fork()、execl()、waitpid()这些细节,还有一些信号


1、这个库函数使用fork()创建一个子进程来;

2、子进程调用/bin/sh-c cmd执行指定的参数命令(/bin/sh一般是一个软连接,指向某个具体的shell,比如bash,-c选项告诉shell从字符串cmd中读取命令),执行完之后返回调用原进程;

3、父进程调用waitpid等待子进程结束。

执行命令时SIGCHLD将被阻塞,在调用system()的进程中SIGINT和SIGQUIT将被忽略。


返回值:

如果cmd是NULL,返回非0,一般为1;

如果fork()失败,即子进程无法被创建,返回-1;

如果shell在子进程中不能被替换,即execl()失败,返回127;

如果所有系统调用成功了,子进程执行cmd命令,但cmd命令不一定执行成功,返回cmd通过exit或return返回的值;


system()源码:

intsystem(constchar*cmdstring)
{
pid_tpid;
intstatus;
if(cmdstring==NULL)
{
return(1);//如果cmdstring为空,返回非零值,一般为1
}
if((pid=fork())<0)
{
status=-1;//fork失败,返回-1
}
elseif(pid==0)
{
execl("/bin/sh","sh","-c",cmdstring,(char*)0);
_exit(127);//exec执行失败返回127,注意exec只在失败时才返回现在的进程,成功的话现在的进程就不存在啦~~
}
else//父进程
{
while(waitpid(pid,&status,0)<0)
{
if(errno!=EINTR)
{
status=-1;//如果waitpid被信号中断,则返回-1
break;
}
}
}
returnstatus;//如果waitpid成功,则返回子进程的返回状态
}

system()会继承环境变量,编写具有SUID/SGID权限的程序时不要用这个函数

建议system()只用来执行shell命令

建议监控一下system()函数执行完毕之后的errno值

建议使用popen()代替system()



http://blog.sina.com.cn/s/blog_8043547601017qk0.html


《完》

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读