博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux 下在程序中调用shell命令
阅读量:5078 次
发布时间:2019-06-12

本文共 3949 字,大约阅读时间需要 13 分钟。

分类:

在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 ");  

 

转载于:https://www.cnblogs.com/roland1982/p/3792920.html

你可能感兴趣的文章
深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
查看>>
tar exclude用法
查看>>
spider RPC高级特性
查看>>
hadoop debug script
查看>>
Hadoop could not find or load main class
查看>>
mac lion 系统安装
查看>>
Linux下程序守护脚本的应用实例
查看>>
win7开启Administrator账户
查看>>
Vue.js中全局组件和局部组件的编写差异和注意事项
查看>>
cordova 日曆 聯系人 插件使用
查看>>
1046: [HAOI2007]上升序列(dp)
查看>>
Maven创建Web项目、、、整合SSM框架
查看>>
转!!深入理解 Session 与 Cookie
查看>>
Dojo 1.6 beta1 发布
查看>>
用node.js做cluster,监听异常的邮件提醒服务
查看>>
Ninject 2.x细说---1.基本使用
查看>>
css,js加载阻塞页面渲染的理解
查看>>
合并相同字段
查看>>
黑名单设计
查看>>
TP5 查询mysql数据库时的find_in_set用法
查看>>