`
songlei8090
  • 浏览: 39004 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在Linux的应用程序里面调用shell

阅读更多

在Linux的应用程序里面调用我的shell(这玩意功能实在太强大)的办法有很多种一般来说有fork()、exec*()、pipe、system()其中又以system()


调用很少方便,现在加以说明。
#include
#include 
int main()
{

   system(“ifconfig eth0 10.17.28.1”);

//system(“./ifconfig.sh”);使用你的脚本shell路径要注意

   return 0;

}

//------------------------------------------------------------------------------------------------------------------------------------------------------


exec*


方法二: exec( )函数族(转) 
      下面我们来看看一个进程如何来启动另一个程序的执行。在Linux中要使用exec函数族。系统调用execve()对当前进程进行替换,替换者为一个指定的程序,其参数包括文件名(filename)、参数列表(argv)以及环境变量(envp)。exec函数族当然不止一个,但它们大致相同,在 Linux中,它们分别是:execl,execlp,execle,execv,execve和execvp,下面我只以execlp为例,其它函数究竟与execlp有何区别,请通过manexec命令来了解它们的具体情况。 


     一个进程一旦调用exec类函数,它本身就"死亡"了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,唯一留下的,就是进程号,也就是说,对系统而言,还是同一个进程,不过已经是另一个程序了。(不过exec类函数中有的还允许继承环境变量之类的信息。) 


     那么如果我的程序想启动另一程序的执行但自己仍想继续运行的话,怎么办呢?那就是结合fork与exec的使用。 下面一段代码显示如何启动运行其它程序:


char command[256]; 


void main() 

int rtn; /*子进程的返回数值*/ 

while(1) 


/* 从终端读取要执行的命令 */
printf( ">" );
fgets( command, 256, stdin ); 
command[strlen(command)-1] = 0; 
if ( fork() == 0 ) 
{
/* 子进程执行此命令 */ 
execlp( command, command ); 
/* 如果exec函数返回,表明没有正常执行命令,打印错误信息*/ 
perror( command ); exit( errorno ); } 
else



/* 父进程, 等待子进程结束,并打印子进程的返回值 */


wait ( &rtn );


printf( " child process return %d\n",. rtn ); 


}


}


}


       此程序从终端读入命令并执行之,执行完成后,父进程继续等待从终端读入命令。熟悉DOS和WINDOWS系统调用的朋友一定知道


DOS/WINDOWS 也有exec类函数,其使用方法是类似的,但DOS/WINDOWS还有spawn类函数,因为DOS是单任务的系统,它只能将"父进程"驻留在机器内再执行"子进程",这就是spawn类的函数。WIN32已经是多任务的系统了,但还保留了spawn类函数,WIN32中实现spawn函数的方法同前述 UNIX中的方法差不多,开设子进程后父进程等待子进程结束后才继续运行。UNIX在其一开始就是多任务的系统,所以从核心角度上讲不需要spawn类函数。


/------------------------------------------------------------------------------------------------------------------------------------------------------


system 是在单独的进程中执行命令,完了还会回到你的程序中。 
而exec函数是直接在你的进程中执行新的程序,新的程序会把你的程序覆盖,除非调用出错,否则你再也回不到exec后面的代码,就是说你的程序就变成了exec调用的那个程序了.


/------------------------------------------------------------------------------------------------------------------------------------------------------


#include 
#include 
#include 
int main(int argc, char *argv[]) { 
    char *envp[] = { "PATH=/tmp", "USER=lei", "STATUS=testing", NULL }; 
    char *argv_execv[] = { "echo", "excuted by execv", NULL }; 
    char *argv_execvp[] = { "echo", "executed by execvp", NULL }; 
    char *argv_execve[] = { "env", NULL }; 
    if (fork() == 0) { 
        if (execl("/bin/echo", "echo", "executed by execl", NULL) < 0) 
            perror("Err on execl"); 
    } 
    if (fork() == 0) { 
        if (execlp("echo", "echo", "executed by execlp", NULL) < 0) 
            perror("Err on execlp"); 
    } 
    if (fork() == 0) { 
        if (execle("/usr/bin/env", "env", NULL, envp) < 0) 
            perror("Err on execle"); 
    } 
    if (fork() == 0) { 
        if (execv("/bin/echo", argv_execv) < 0) 
            perror("Err on execv"); 
    } 
    if (fork() == 0) { 
        if (execvp("echo", argv_execvp) < 0) 
            perror("Err on execvp"); 
    } 
    if (fork() == 0) { 
        if (execve("/usr/bin/env", argv_execve, envp) < 0) 
            perror("Err on execve"); 
    } 
    return 0; 
}


/------------------------------------------------------------------------------------------------------------------------------------------------------


    程序里调用了2 个Linux 常用的系统命令,echo和env。echo会把后面跟的命令行参数原封不动的打印出来,env用来列出所有环境变量。 
由于各个子进程执行的顺序无法控制,所以有可能出现一个比较混乱的输出–各子进程打印的结果交杂在一起,而不是严格按照程序中列出的次序。 
最常见的错误: 
大家在平时的编程中,如果用到了exec 函数族,一定记得要加错误判断语句。因为与其他系统调用比起来,exec很容易受伤,被执行文件的位置,权限等很多因素都能导致该调用的失败。 
最常见的错误是: 
1)找不到文件或路径,此时errno 被设置为ENOENT; 
2)数组argv和envp忘记用NULL结束,此时errno被设置为EFAULT; 
3)没有对要执行文件的运行权限,此时errno被设置为EACCES。


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

void   main() 

        pid_t   pid; 

        if   (pid   =   fork()   <   0) 
                printf( "fork   error!\n "); 
        else   if(pid   ==   0)   /*child   process*/ 
        { 
                execl( "processname ",   "prarm1 ", "prarm2 ");   //prarm1,prarm2是传递给haha.exe的参数 
          }   
          else     /*parent   process*/ 
          { 
                //do   something..... 
          } 


再unix/linux调用程序的方法,如果想启动一个shell,就用system( "command ");

0
0
分享到:
评论

相关推荐

    java调用shell(包含有参数的调用)

    在某些情况下,Java程序需要调用Shell脚本执行特定的操作,比如访问Linux系统命令或者自动化执行一些任务。本文将详细解释Java如何调用Shell脚本,包括如何编写Shell脚本和在Java中如何传递参数。 首先,Shell脚本...

    android系统中调用shell脚本

    在Android系统中,由于安全性和权限的限制,直接调用shell脚本并不像在Linux或Unix环境下那样简单。然而,对于非root用户来说,确实有一些方法可以实现对shell脚本的调用,尤其是在开发和调试过程中。下面我们将深入...

    Android程序中(APK程序)执行Adb shell 命令

    在Android程序开发中,有时我们需要在应用程序内部执行一些系统级别的操作,这通常涉及到与底层Linux系统的交互。Android Debug Bridge(ADB)就是一个强大的工具,允许开发者从计算机上对连接的Android设备进行各种...

    深入浅出嵌入式Linux应用程序开发MP4视频.zip

    深入浅出嵌入式Linux应用程序开发MP4视频. 嵌入式系统概述。 Linux系统体验。 shell编程基础-变量详解。 shell编程基础-语句详解。 shell编程基础-函数详解。 shell编程实例分析。 linux应用程序设计基础-GCC编译器...

    linux shell监控应用程序日志报错

    在这个场景中,我们关注的是如何利用shell脚本来监控应用程序日志,特别是针对日志中的错误信息进行实时检测。`checkwarning.cfg`和`checkref.cfg`可能包含的是监控规则和配置信息,而`checkwarning.sh`和`checkref....

    嵌入式linux应用程序开发-课程大纲

    ### 嵌入式Linux应用程序开发课程大纲解析 #### 第一部分:嵌入式开发基础强化训练 本部分作为课程的入门阶段,旨在帮助学生建立起扎实的Linux基础与嵌入式开发技能,为后续深入学习奠定基石。 **1. Linux操作...

    使用runtime实现linux命令行或shell脚本多次调用

    在标题提到的场景中,我们需要多次调用Linux命令或shell脚本。`Runtime.exec(String command)`方法用于执行单个命令,而如果需要执行包含多个命令的shell脚本,可以使用`Runtime.exec(String[] cmdArray)`,其中...

    Linux Shell 小程序 :Coral Shell

    在本文中,我们将深入探讨Linux Shell小程序的核心概念、设计原则以及C语言在实现Shell时的关键技术。 1. **Shell脚本基础**: - **Shell脚本**:Shell脚本是包含一系列命令的文本文件,这些命令按照执行顺序运行...

    基于Shell脚本在Linux系统教学运维环境配置的应用.pdf

    它支持各种控制结构(如if-else、for、while循环)、变量、数组、函数,并且能调用系统内建命令和外部程序。此外,Shell脚本还拥有强大的文本处理工具,如grep、sed和awk,可用于数据搜索、替换和分析。 【教学环境...

    Linux 应用程序开发入门技巧

    在《Linux应用程序开发入门》这本书中,你将找到更多关于这些主题的详细解释和实例,包括如何使用makefile组织项目、如何优化性能、以及如何使用man手册查找函数文档等。通过深入阅读和实践,你将能够熟练掌握Linux...

    linux-ts一个shell测试脚本

    在实际项目中,"ts"脚本可能被用作集成测试的一部分,对系统服务、应用程序接口或特定功能进行自动化测试。例如,它可能检查某个程序是否正确安装,或者验证服务在特定条件下能否正常运行。 标签"Linux开发-Shell...

    Linux应用程序开发详解

    开发Linux应用程序的基础是熟悉Linux内核、shell脚本以及文件系统的工作原理。 1. **编程语言选择**: - C/C++:作为最基础的编程语言,C和C++在Linux开发中占据主导地位,它们能直接与硬件交互,效率高,但需要...

    java 远程调用Shell脚本客户端包

    Java 远程调用Shell脚本客户端包是一个实用的工具,专为开发者设计,使得在Java应用程序中执行远程Shell命令变得简单而高效。这个包的主要功能是通过Java代码发起对远程服务器上的Shell脚本的调用,从而实现跨平台的...

    嵌入式linux应用程序开发详解完整版

    《嵌入式Linux应用程序开发详解完整版》是针对在Linux操作系统环境下进行嵌入式系统开发的一本详尽指南。该资料全面涵盖了从基础知识到高级应用的各个层面,旨在帮助开发者深入理解和熟练掌握嵌入式Linux应用程序的...

    java调用shell脚本

    在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如调用Shell脚本。这在处理自动化任务、远程服务器管理或系统集成时非常常见。在给定的资源中,我们可以看到如何在Java中实现这个功能,...

    Linux makefile 和shell文件相互调用实例详解

    #### 二、Makefile文件内调用Shell脚本 除了从Shell脚本中调用Makefile外,反过来也是可能的。Makefile可以通过执行shell命令的方式调用外部的Shell脚本。下面是一个示例Makefile: ```makefile SHELL:=/bin/bash ...

Global site tag (gtag.js) - Google Analytics