`
灵动的水
  • 浏览: 194678 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

linux system函数使用详解本篇文章来源于:开发学院 http://edu.codepub.com 原文链接:http://edu.codepub.

阅读更多
相关函数
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
分享到:
评论

相关推荐

    Js之软键盘实现(源码)本篇文章来源于:开发学院 http://edu.codepub.com 原文链接:http://edu.codepub.com/2009/0512/4061.php

    根据给定的文件信息,我们可以深入探讨如何使用JavaScript(JS)来实现软键盘的功能,这是一个在Web开发中非常实用的技术,尤其是在移动设备上,能够提供更佳的用户体验。以下是对软键盘实现的关键知识点的详细解释...

    优秀网站源码、编程源码下载网站大集中

    3. **源码网** (http://www.codepub.com/):提供了大量的开源项目源码,涵盖各种领域,如电商、社交、教育、游戏等,方便开发者根据需求查找相关项目。 4. **虾客源码** (http://www.xkxz.com/):以PHP源码为主,...

    30个源码网站,找源码必备!

    源码库:[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/) - 以分享各类实用源码为主,同时提供了相关的技术文章和技术支持。 ##...

    毕业设计,基于PHP+MySQL开发的整站程序-WordPress英文网站(带27000文章数据),内含完整源代码,数据库脚本

    1 解压文件到你的网站目录,假设你的绑定网址为http://www.codepub.com/xxx 2 打开http://www.xxx.com/xxx/ebak2 帐号:admin 密码:123456 ,在ebak2下面建立zip目录 3 进入后修改参数设置,设置你的数据库版本,和...

    Java 学习资料

    1. **源码网-JAVA教程([http://www.codepub.com/software/download-190-1.html](http://www.codepub.com/software/download-190-1.html))** - **特点**:提供了丰富的Java教程和资料,覆盖了从基础知识到高级技术...

    编程网址大全(包含了大部分的源码网站)

    ### 编程网址大全知识点详解 #### 一、概述 编程是现代信息技术的核心技能之一,随着互联网技术的发展,越来越多的人开始关注并投入到编程的学习与实践中。对于编程爱好者来说,能够找到高质量的源码网站是非常...

    java学习的特别网站

    - 链接:&lt;http://www.codepub.com/software/download-190-1.html&gt; - **CodeFans** - 另一个学习资源站点。 - 链接:&lt;http://www.codefans.net/sort/list_7_136_1.shtml&gt; - **Thinking in Java** - 经典Java图书...

    Java学习网站汇总

    - 下载地址:http://www.codepub.com/software/download-190-1.html - **特色**:不仅提供源码下载,还附带详细的教程。 6. **源码爱好者-JAVA教程** - 下载地址:...

    学习C#的源代码网站

    CodePub (http://www.codepub.com/) - **简介**:提供各类编程语言的学习资料和源代码,C#方面的资源更新及时。 - **特色**:除了源代码外,还提供在线编译器,方便用户测试代码效果。 #### 4. XianKaiZhi ...

    [源码网]Java2核心技术II卷.高级特性7th[www.codepub.com].part1.rar

    [源码网]Java2核心技术II卷.高级特性7th[www.codepub.com].part1.rar

    如何在精简版的OS安装IIS

    ### 如何在精简版操作系统上安装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]...

    程序员要知道的65的源代码网站

    源码库 (http://www.codepub.com/) - **特色**:专注于开源软件和技术文档的分享,对于寻找特定技术实现方案的开发者非常有用。 - **资源类型**:开源软件、技术文档等。 #### 4. 美术源码 (http://www.xkxz.com/)...

    最好的20个源码下载网站

    CodePub (http://www.codepub.com/) CodePub是一个面向全球的开源代码共享平台,提供了大量免费的源码资源。这里的资源覆盖了多个领域,包括但不限于Web开发、移动应用开发等。此外,CodePub还鼓励用户贡献自己的...

    财务管理系统其中包括队员档案管理,财务收支管理等简单的应用管理

    改代码最初地址为:http://www.codepub.com/software/view-software-11340.html 51aspx修正后,填充了测试数据,修正了一下数据错误的代码 作者:星期八 更多内容请访问阿里西西www.alixixi.com

    CodePub.Com说明

    - **联系方式**:用户在使用过程中如有任何问题或建议,可通过电子邮件联系网站管理员,邮箱地址为wuse#codepub.com(实际使用时应将#替换为@)。 ### 深入分析 #### 1. WinRAR V3.4及以上的版本优势 - **兼容性**...

    小型操作系统GeekOS.rar

    http://www.codepub.com/d/downpage.php?n=1&id=15708::1245422663 小型操作系统 GeekOS 0.3.0 * 软件评价: * 是否推荐:否 相关评论 * 软件大小:580KB * 运行环境:C语言 * 授权/语言:开源软件/简体中文 ...

    65个源码网站

    在IT领域,源码是软件开发的核心资源,它包含了程序的逻辑、算法和设计思想,对于学习编程、提升技能、解决技术难题以及进行二次开发都有着不可替代的作用。本文将基于提供的“65个源码网站”信息,深入解析其中的...

    DiveIntoPython

    "CodePub.Com说明.txt"文件可能是关于如何在CodePub平台上使用或发布这个教程的一些说明。CodePub可能是一个在线学习平台或代码托管网站,这个文件可能包含使用该资源的指南、版权信息、许可协议等细节,这对于尊重...

Global site tag (gtag.js) - Google Analytics