相关函数
fork,execve,waitpid,popen
表头文件
#i nclude<stdlib.h>
定义函数
int system(const char * string);
函数说明
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命>令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
返回值
=-1:出现错误
=0:调用成功但是没有出现子进程
>0:成功退出的子进程的id
如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值>。 如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为 system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。
附加说明
在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。
范例
#i nclude<stdlib.h>
main()
{
system(“ls -al /etc/passwd /etc/shadow”);
}
执行结果:
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
-r--------- 1 root root 572 Sep 2 15 :34 /etc/shado
例2:
char tmp[];
sprintf(tmp,"/bin/mount -t vfat %s /mnt/usb",dev);
system(tmp);
其中dev是/dev/sda1。
system源码
#include
#include
#include
#include
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("/bin/sh", "sh", "-c", cmdstring, (char *)0);
-exit(127); //子进程正常执行则不会执行此语句
}
else{
while(waitpid(pid, &status, 0) < 0){
if(errno != EINTER){
status = -1;
break;
}
}
}
return status;
}
先分析一下原理,然后再看上面的代码大家估计就能看懂了:
当system接受的命令为NULL时直接返回,否则fork出一个子进程,因为fork在两个进程:父进程和子进程中都返回,这里要检查返回的pid,fork在子进程中返回0,在父进程中返回子进程的pid,父进程使用waitpid等待子进程结束,子进程则是调用execl来启动一个程序代替自己,execl("/bin/sh", "sh", "-c", cmdstring,(char*)0)是调用shell,这个shell的路径是/bin/sh,后面的字符串都是参数,然后子进程就变成了一个shell进程,这个shell的参数是cmdstring,就是system接受的参数。在windows中的shell是command,想必大家很熟悉shell接受命令之后做的事了。
如果上面的你没有看懂,那我再解释下fork的原理:当一个进程A调用fork时,系统内核创建一个新的进程B,并将A的内存映像复制到B的进程空间中,因为A和B是一样的,那么他们怎么知道自己是父进程还是子进程呢,看fork的返回值就知道,上面也说了fork在子进程中返回0,在父进程中返回子进程的pid。
execl是编译器的函数(在一定程度上隐藏具体系统实现),在linux中它会接着产生一个linux系统的调用execve, 原型见下:
int execve(const char * file,const char **argv,const char **envp);
看到这里你就会明白为什么system()会接受父进程的环境变量,但是用system改变环境变量后,system一返回主函数还是没变,原因从system的实现可以看到,它是通过产生新进程实现的,从我的分析中可以看到父进程和子进程间没有进程通信,子进程自然改变不了父进程的环境变量本篇文章来源于:开发学院 http://edu.codepub.com 原文链接:http://edu.codepub.com/2010/1017/26463.php
分享到:
相关推荐
根据给定的文件信息,我们可以深入探讨如何使用JavaScript(JS)来实现软键盘的功能,这是一个在Web开发中非常实用的技术,尤其是在移动设备上,能够提供更佳的用户体验。以下是对软键盘实现的关键知识点的详细解释...
3. **源码网** (http://www.codepub.com/):提供了大量的开源项目源码,涵盖各种领域,如电商、社交、教育、游戏等,方便开发者根据需求查找相关项目。 4. **虾客源码** (http://www.xkxz.com/):以PHP源码为主,...
源码库:[http://www.codepub.com/](http://www.codepub.com/) - **特色**:提供丰富的开源项目和技术文档,涵盖Web开发、移动应用开发等多个领域。 - **应用场景**:适合全栈开发者和对多个技术方向感兴趣的开发者...
28. **CodePub** (http://www.codepub.com/):网站源码下载平台,提供各种类型的源码资源。 29. **西安交通大学国家精品课程** (http://netcourse.xjtu.edu.cn/):高校精品课程,可在线学习高等教育课程。 30. **...
源码网 (http://www.codepub.com/) - 专注于发布高质量的源码资源,覆盖了前端、后端等多个领域。 #### 4. 虾客源码 (http://www.xkxz.com/) - 以分享各类实用源码为主,同时提供了相关的技术文章和技术支持。 ##...
1 解压文件到你的网站目录,假设你的绑定网址为http://www.codepub.com/xxx 2 打开http://www.xxx.com/xxx/ebak2 帐号:admin 密码:123456 ,在ebak2下面建立zip目录 3 进入后修改参数设置,设置你的数据库版本,和...
1. **源码网-JAVA教程([http://www.codepub.com/software/download-190-1.html](http://www.codepub.com/software/download-190-1.html))** - **特点**:提供了丰富的Java教程和资料,覆盖了从基础知识到高级技术...
### 编程网址大全知识点详解 #### 一、概述 编程是现代信息技术的核心技能之一,随着互联网技术的发展,越来越多的人开始关注并投入到编程的学习与实践中。对于编程爱好者来说,能够找到高质量的源码网站是非常...
- 链接:<http://www.codepub.com/software/download-190-1.html> - **CodeFans** - 另一个学习资源站点。 - 链接:<http://www.codefans.net/sort/list_7_136_1.shtml> - **Thinking in Java** - 经典Java图书...
- 下载地址:http://www.codepub.com/software/download-190-1.html - **特色**:不仅提供源码下载,还附带详细的教程。 6. **源码爱好者-JAVA教程** - 下载地址:...
CodePub (http://www.codepub.com/) - **简介**:提供各类编程语言的学习资料和源代码,C#方面的资源更新及时。 - **特色**:除了源代码外,还提供在线编译器,方便用户测试代码效果。 #### 4. XianKaiZhi ...
[源码网]Java2核心技术II卷.高级特性7th[www.codepub.com].part1.rar
### 如何在精简版操作系统上安装IIS...- 对于Windows 2003:[IIS6.0](http://down1.codepub.com/codepub/2005/8/30/IIS6.0.rar)、[下载地址 2](http://down2.codepub.com/codepub/2005/8/30/IIS6.0.rar)、[下载地址 3]...
源码库 (http://www.codepub.com/) - **特色**:专注于开源软件和技术文档的分享,对于寻找特定技术实现方案的开发者非常有用。 - **资源类型**:开源软件、技术文档等。 #### 4. 美术源码 (http://www.xkxz.com/)...
CodePub (http://www.codepub.com/) CodePub是一个面向全球的开源代码共享平台,提供了大量免费的源码资源。这里的资源覆盖了多个领域,包括但不限于Web开发、移动应用开发等。此外,CodePub还鼓励用户贡献自己的...
改代码最初地址为:http://www.codepub.com/software/view-software-11340.html 51aspx修正后,填充了测试数据,修正了一下数据错误的代码 作者:星期八 更多内容请访问阿里西西www.alixixi.com
- **联系方式**:用户在使用过程中如有任何问题或建议,可通过电子邮件联系网站管理员,邮箱地址为wuse#codepub.com(实际使用时应将#替换为@)。 ### 深入分析 #### 1. WinRAR V3.4及以上的版本优势 - **兼容性**...
http://www.codepub.com/d/downpage.php?n=1&id=15708::1245422663 小型操作系统 GeekOS 0.3.0 * 软件评价: * 是否推荐:否 相关评论 * 软件大小:580KB * 运行环境:C语言 * 授权/语言:开源软件/简体中文 ...
在IT领域,源码是软件开发的核心资源,它包含了程序的逻辑、算法和设计思想,对于学习编程、提升技能、解决技术难题以及进行二次开发都有着不可替代的作用。本文将基于提供的“65个源码网站”信息,深入解析其中的...
"CodePub.Com说明.txt"文件可能是关于如何在CodePub平台上使用或发布这个教程的一些说明。CodePub可能是一个在线学习平台或代码托管网站,这个文件可能包含使用该资源的指南、版权信息、许可协议等细节,这对于尊重...