在linux系统下的操作中我们会经常用到shell命令来进行,一开始学习进程的时候对于shell命令也进行了思考,认为shell命令就是一个进程的外壳,经过了后来的学习对于这一点也有了更多的认识。

用过shell命令的都是知道,shell命令有很多,比如去一个目录中文件名的列表是用ls,新建一个文件夹用mkdir等。其实,我们用的shell命令“ls”、“-c”就是shell这个程序的参数,下面我们通过编程来实现shell中的ls命令并将结果写到temp.txt文件中。

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/wait.h>

#define MAX 1024

int system(const char * cmdstring);

int main(void)

{

       int fd , n;

       char buf[MAX];          //保存文件内容的缓冲区

       if(system("ls > temp.txt") == -){ //使用system执行ls命令,并将结果输出到temp.txt文件中

              perror("fail to exec command");

              exit();

       }

       if((fd = open("temp.txt",O_RDWR)) == -){//打开temp.txt文件

              perror("fail to open");

              exit();

       }

       printf("%d\n",fd);

       if((n = read(fd, buf ,MAX)) == -){   //读文件内容

              perror("fail to read");

              exit();

       }

       buf[n] = '\0';   //添加'\0'结束符

       printf("%s",buf);  //文件内容自带'\n'

       return ;

}

这一部分是通过调用system函数实现shell中的ls命令,这一部分是简单的函数调用、文件读写和显示。这里的system函数就相当于是shell,system函数的执行流程分为两部分,首先调用system函数的进程创建一个子进程,并且调用wait函数等待子进程执行完毕。其次是在子进程中调用excel函数加在shell运行cmdstring中的指令,程序如下。

//system1函数的原理性实现

int system(const char * cmdstring)

{

       pid_t pid;

       int status;

       if(cmdstring == NULL)  //如果命令字符串为空,则返回1

              return ;

       pid = fork();          //创建一个子进程

       if(pid < ){

              status = -;

       }else if(pid == ){                 //子进程

              execl("/bin/sh","sh","-c",cmdstring,NULL);  //加载shell,由shell执行命令

              _exit();                                                               //如果执行程序失败,子程序退出,返回127

       }

       if(waitpid(pid, &status, ) == -)             //wait函数出错,抛弃得到的无用状态  

              status = -;

       return status;                                   //返回退出状态

}

上边的程序可以看出这一段原理性实现的主要部分就是子进程这一部分代码的程序,在子进程中加载shell执行命令。

在程序中执行shell命令的更多相关文章

  1. 在 Ruby 中执行 Shell 命令的 6 种方法

    我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb & ...

  2. python中执行shell命令的几个方法小结(转载)

    转载:http://www.jb51.net/article/55327.htm python中执行shell命令的几个方法小结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014- ...

  3. vim中执行shell命令小结

    vim中执行shell命令,有以下几种形式 1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如:!ls -l ...

  4. python中执行shell命令的几个方法小结

    原文 http://www.jb51.net/article/55327.htm 最近有个需求就是页面上执行shell命令,第一想到的就是os.system, os.system('cat /proc ...

  5. python中执行shell命令行read结果

    +++++++++++++++++++++++++++++ python执行shell命令1 os.system 可以返回运行shell命令状态,同时会在终端输出运行结果 例如 ipython中运行如 ...

  6. vim中执行shell命令

    1):!command   不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容   例如   :!ls -l   特别的可以运行:!bas ...

  7. 【译】 AWK教程指南 6在AWK程序中使用Shell命令

    awk程序中允许调用Shell指令,并提供管道解决awk与系统间数据传递的问题.所以awk很容易使用系统资源,读者可利用这个特点来编写某些适用的系统工具. 范例:写一个awk程序来打印出线上人数. 将 ...

  8. 「Python」6种python中执行shell命令方法

    用Python调用Shell命令有如下几种方式: 第一种: os.system("The command you want"). 这个调用相当直接,且是同步进行的,程序需要阻塞并等 ...

  9. 在c++程序中执行DOS命令

    转自博客:http://blog.csdn.net/ypist/article/details/8485049 #1,system()方式 在C盘根目录下新建文件夹,名称为12: system(&qu ...

随机推荐

  1. 《----css样式---------浮动带来的影响与解决方法---------------》

    浮动就是让我们的元素脱离标准文档流,目的是为了布局好看! 浮动的现象: 脱离标准文档流被叫做脱流,同时会出现字围现象. 浮动的元素会相互贴靠,而且如果父容器空间足够大,则浮动的元素会正常紧靠也就是后一 ...

  2. mysql benchmark基准测试

    git项目地址: https://github.com/akopytov/sysbench 利用sysbench很容易对mysql做性能基准测试(当然这个工具很强大,除了测试主流数据库性能,还能测试其 ...

  3. docker 常用命令(*)

    查找镜像 https://hub.docker.com/ search  --> centos7 一般docker 会有一个基础镜像,中间件镜像,应用镜像,生成一个镜像 docker build ...

  4. 聊聊 C 语言中的 sizeof 运算

    聊聊 sizeof 运算 在这两次的课上,同学们已经学到了数组了.下面几节课,应该就会学习到指针.这个速度的确是很快的. 对于同学们来说,暂时应该也有些概念理解起来可能会比较的吃力. 先说一个概念叫内 ...

  5. Java处理 文件复制

    try { InputStream in = new FileInputStream(new File(oldPath)); OutputStream out = new FileOutputStre ...

  6. beanstalkd 消息队列

    概况:Beanstalkd,一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Faceb ...

  7. C#-WebForm-文件上传-FileUpload控件

    FileUpload - 选择文件,不能执行上传功能,通过点击按钮实现上传 默认选择类型为所有类型 //<上传>按钮 void Button1_Click(object sender, E ...

  8. MapControl控件AddLayer出现错误-引发类型为“System.Windows.Forms.AxHost+InvalidActiveXStateException”的异常

    出错代码: AxMapControl pMptrl = new AxMapControl(); //add data string mdbPath = string.Format("{0}\ ...

  9. 架构师养成记--6.单例和多线程、ThreadLocal

    一.ThreadLocal 使用wait/notify方式实现的线程安全,性能将受到很大影响.解决方案是用空间换时间,不用锁也能实现线程安全. 来看一个小例子,在线程内的set.get就是thread ...

  10. Java 抽象类与接口

    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是 Java 语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予 Java 强大的面向对象的能力.他们两者之间对 ...