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

C函数调用shell脚本

阅读更多
C程序调用shell脚本共有三种方式:system()、popen()、exec系列函数

1)system(shell命令或shell脚本路径);
   
    执行过程:system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
   
    返回值:如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果 system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。

    注意:在编写具有SUID/SGID权限的程序时最好不要使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。

例:在~/myprogram/目录下有shell脚本test.sh,内容为

#!bin/bash
#test.sh
echo $HOME

在该目录下新建一个c文件systemtest.c,内容为:

#include<stdlib.h>
/*This program is used to test function system*/

main()
{
  system("~/myprogram/test.sh");
}

执行结果如下:

xiakeyou@ubuntu:~/myprogram$ gcc systemtest.c -o systemtest
xiakeyou@ubuntu:~/myprogram$ ./systemtest
/home/d/e/xiakeyou
xiakeyou@ubuntu:~/myprogram$

2)popen(char *command,char *type)   

    执行过程:popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。

    返回值:若成功则返回文件指针,否则返回NULL,错误原因存于errno中。

    注意:在编写具SUID/SGID权限的程序时请尽量避免使用popen(),popen()会继承环境变量,通过环境变量可能会造成系统安全的问题。
例:C程序popentest.c内容如下:

    #include<stdio.h>
    main()
    {
        FILE * fp;
        charbuffer[80];
        fp=popen(“~/myprogram/test.sh”,”r”);
        fgets(buffer,sizeof(buffer),fp);
        printf(“%s”,buffer);
        pclose(fp);
    }

执行结果如下:

xiakeyou@ubuntu:~/myprogram$ vim popentest.c
xiakeyou@ubuntu:~/myprogram$ gcc popentest.c -o popentest
xiakeyou@ubuntu:~/myprogram$ ./popentest
/home/d/e/xiakeyou
xiakeyou@ubuntu:~/myprogram$
分享到:
评论

相关推荐

    Linux 在Shell脚本中使用函数实例详解

    Linux 在Shell脚本中使用函数实例详解 Shell的函数 Shell程序也支持函数。函数能完成一特定的功能,可以重复调用这个函数。 函数格式如下: 函数名() { 函数体 }  函数调用方式: 函数名 参数列表  实例:编写...

    输出执行操作和打印日志的shell脚本实例

    cat /mnt/log_function.sh #!/bin/bash #log function ####log_correct函数打印正确的输出到日志文件 function log_correct () { DATE=`date “+%Y-%m-%d %H:%M:%S”` ####显示打印日志的时间...log_error打印shell脚本

    shell自定义函数及参数调用解析

    可以传递参数给函数,并由脚本进行访问:fname arg1 arg2; # 传递参数 以下是函数fname的定义。在函数fname中,包含了各种访问函数参数的方法。 代码如下:fname(){ echo $1, $2; # 访问参数1和参数2 echo “$@”; ...

    Shell脚本中引用、调用另一个脚本文件的2种方法

    在Shell中要如何调用别的shell脚本,或别的脚本中的变量,函数呢? 方法一: . ./subscript.sh  方法二: source ./subscript.sh 注意: 1.两个点之间,有空格,千万注意. 2.两个脚本不在同一目录,要用绝对路径 3.为...

    Shell脚本编程详解

    Shell脚本编程详解  Shell命令行的运行  编写、修改权限和执行Shell程序的步骤  在Shell程序中使用参数和变量  表达式比较、循环结构语句和条件结构语句  在Shell程序中使用函数和调用其他Shell程序

    从Linux程序中执行shell(程序、脚本)并获得输出结果

    Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作。比如实现一个ping程序来测试网络的连通性,实现ping函数需要写上200~300行代码...

    Shell 脚本编程最佳实践.doc

    毕竟shell脚本这个东西不算是正经的编程语言,他更像是一个工具,用来杂糅不同的程序供我们调用。因此很多人在写的时候也是想到哪里写到哪里,基本上都像是一段超长的main函数,不忍直视。

    shell脚本-查找C结构体和函数的定义

    对于linux/unix c的初学者来说,读代码的时候经常会想知道一些系统调用和系统用的结构体的定义,使用这个脚本就可以查出结构体和函数的定义。

    Shell脚本学习笔记

    5.5.3 调用定期脚本 107 5.6 从头开始 109 5.6.1在启动时启动脚本 109 5.6.2随新shell一起启动 109 第6章 创建函数 110 6.1 基本脚本函数 110 6.1.1 创建函数 110 6.1.2 使用函数 110 6.2 返回值 111 6.2.1 默认退出...

    基于shell脚本中cd命令无效的解决方法

    解释:执行的时候是./c.sh来执行的,这样执行的话终端会产生一个子shell(类似于C语言调用函数),子shell去执行我的脚本,在子shell中已经切换了目录了,但是子shell一旦执行完,马上退出,子shell中的变量和操作...

    Shell脚本中使用function(函数)示例

    主要介绍了Shell脚本中使用function(函数)示例,本文着重讲解的是如何在shell脚本中使用自定义函数,并给出了两个例子,需要的朋友可以参考下

    Matlab Shell:用于从命令行执行 Matlab 的 Bash shell 脚本。 旨在与 Make 脚本一起使用。-matlab开发

    非常简单的 Bash shell 脚本,以干净的方式从命令行执行 Matlab。 此脚本的预期用途是在使用 Matlab 生成代码时从 Make 文件调用 Matlab。 尽管仍然可以生成图形图像,但所有输出到屏幕的图形都被抑制。 脚本将 M ...

    Shell中的函数、函数定义、作用域问题介绍

    说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总结一下...

    Shell脚本编程详解-吐血共享.rar_shell script

    shell 脚本关键语法共享 ? Shell 命令行的运行 ? 编写、修改权限和执行 Shell 程序的步骤 ? 在 Shell 程序中使用参数和变量 ? 表达式比较、循环结构语句和条件结构... 在 Shell 程序中使用函数和调用其他 Shell 程序

    weblogic守护进程:监控weblogic进程,当发现进程停止时调用重启脚本重启

    #功能:weblogic守护进程:监控weblogic进程,当发现进程停止时调用重启脚本重启 #参数:进程唯一标识码,例如“weblogic” #依赖脚本:数据库操作脚本dbExecurteSQL.sh,weblogic重启脚本$PSSC_DOMAIN/startPssc.sh...

    Learn-Shell:“ Wicked Cool Shell脚本,第二版”的代码和注释

    Wicked Cool Shell Scripts,第二版的Shell脚本集合Wicked Cool Shell Scripts第二版的完整Shell脚本如何使用采购wcss_shell.sh脚本将设置您的bash环境,以便可以从PATH调用这些脚本,而不必相对或绝对地调用这些...

    Linux下Shell脚本中几种基本命令的替换区别

    编写大量shell脚本时,累计了大量经验,也让自己开始迷糊几种函数输出调用的区别。后面和前辈们请教了一下这个问题,大致明白了区别。这里分享给大家,希望对大家能有所收获。下面来一起看看吧。

    C语言获取Shell返回结果的实现方法

    Linux编程时候,如果我们需要调用shell命令或脚本通常使用system方法。如system&#40;“ls”&#41; 该方法返回值为0或-1,即成功或失败。而有的时候我们想要获取shell命令执行的结果,该怎么办呢? 我们可以将shell...

    Linux函数和脚本

    1.控制Shell脚本执行顺序 1.条件测试和信号捕获 1.退出状态 2.测试状态 1.文件状态测试 2.变量状态测试 3.字符串和数值状态测试 4.逻辑操作符 3.捕获系统信号 1.系统信号说明 1.1 SIGHUP 2.2 SIGINT 3.3 SIGQUIT 4.4...

    Linux_基础教程--Shell脚本编程.ppt

    本文档为原创,主要讲解了基于linux平台的bash编程基本命令使用,帮助学习者熟悉Shell 脚本的编码规范,掌握执行和调试方法,掌握对变量进行整数运算和间接引用的方法,理解位置参数变量和特殊参数变量的用途,掌握...

Global site tag (gtag.js) - Google Analytics