`
zhengweizhong
  • 浏览: 75398 次
  • 性别: 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$
分享到:
评论

相关推荐

    解决Unity不能调用shell脚本传递参数的问题

    ### 解决Unity不能调用shell脚本传递参数的问题 在Unity开发过程中,有时我们需要与操作系统进行交互,例如执行shell脚本来处理一些特定的任务。但在实际操作中,可能会遇到Unity无法正确调用shell脚本并传递参数的...

    python调用shell脚本

    综上所述,Python调用shell脚本涉及的知识点包括:`os`模块的`system()`函数,`subprocess`模块的`run()`、`check_output()`和`Popen()`,以及如何处理安全问题。理解并熟练运用这些工具,能让你在Python中更有效地...

    oracle数据库调用shell脚本全套

    在Oracle数据库中调用Shell脚本是数据库管理员和开发者常用的一种技术,特别是在自动化运维和集成系统中。这个“oracle数据库调用shell脚本全套”可能包含了一系列教程、源码和示例,帮助用户理解并实现这一功能。...

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

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

    Linux-test-shell.zip 练习 Linux 调用shell脚本

    调用Shell脚本有几种方式: 1. 直接执行:如果脚本在同一目录下,可以使用`./script.sh`。 2. 全路径执行:如果知道脚本的完整路径,可以直接`/path/to/script.sh`。 3. 环境变量:将脚本路径添加到PATH环境变量中,...

    shell脚本调用python脚本,并传参

    本篇文章将详细介绍如何在`Shell`脚本中调用`Python`脚本并传递参数,以及如何应用这一技术来删除指定日期前的文件。 首先,我们来看如何在`Shell`中调用`Python`脚本。这通常通过`python`或`python3`命令来实现,...

    250个shell脚本

    通过学习和实践这些脚本,你可以深入理解Shell脚本的基本语法、变量、函数、流程控制结构,以及如何调用系统命令。 Shell编程的核心知识点包括: - 命令行参数:如$0, $1, $@等,用于接收脚本执行时传递的参数。 - ...

    输出执行操作和打印日志的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脚本

    如何让Android系统或Android应用执行shell脚本

    我们可以在 init.c 中添加一条命令来执行 shell 脚本。例如,我们可以在 init.c 中添加以下代码: `service usblp_test /data/setip/init.usblpmod.sh oneshot disabled` 这条命令将在系统启动时执行 /data/setip/...

    JAVA如何调用Shell脚本

    JAVA如何调用Shell脚本 本文主要介绍了JAVA如何调用Shell脚本,提供了一种实用的解决方案,即使用JAVA的Runtime.getRuntime().exec()方法调用Shell脚本。下面将详细介绍该方法的实现过程和注意事项。 为什么需要...

    Linux shell 脚本攻略源代码第二版

    函数是Shell脚本的另一个重要概念,它们允许你封装可重用的代码段。通过定义和调用函数,可以提高脚本的可读性和维护性。书中的示例会展示如何声明、传递参数和返回值。 条件测试是控制流程的关键部分。在Shell脚本...

    Shell 脚本专家指南

    4. 函数编写:掌握如何在Shell脚本中定义和调用函数,以及参数传递和局部变量的作用域。 5. 脚本调试和测试:学习使用调试工具和方法对脚本进行错误检测和问题诊断,以及如何编写测试用例确保脚本的稳定性和可靠性...

    shell脚本学习指南

    Shell脚本能够调用系统命令,实现更复杂的任务。例如,`find`命令用于查找文件,`grep`用于搜索文本,`sed`和`awk`进行文本处理,`sort`和`uniq`处理排序和去重,`tar`和`gzip`则用于文件打包和压缩。 五、在嵌入式...

    Shell脚本专家指南

    4. 函数:学习如何定义和调用Shell函数,以实现代码复用。 三、Shell脚本高级特性 1. 赋值运算符:了解测试运算符(==、!=、-eq等)和逻辑运算符(&&、||)。 2. 正则表达式:学习如何在脚本中使用正则表达式进行...

    shell脚本-大数据

    Hadoop的MapReduce模型和Spark的DataFrame API可以通过shell脚本调用,实现分布式计算任务的提交。例如,通过`hadoop jar`命令运行MapReduce作业,或者用`spark-submit`启动Spark应用,这样可以利用shell脚本实现...

    shell脚本学习指南,中文清晰带书签

    - **函数定义与调用**:Shell脚本支持函数定义,可以提高代码的复用性和可读性。 - 示例: ```bash function greet() { echo "Hello, $1" } greet "Alice" ``` - **错误处理**:通过设置脚本的退出状态码...

    LINUX SHELL 脚本攻略

    Shell脚本的基本构成包括:变量、环境变量、命令执行、流程控制(如if语句、for循环、while循环等)、函数定义和使用、输入输出处理等。掌握这些基本元素对于编写有效、高效的Shell脚本至关重要。 1. 变量和环境...

    非常简单的Shell菜单脚本

    在Linux系统中,Shell脚本是一种强大的自动化工具,可以实现一系列命令的集合,方便用户进行交互式操作。本文介绍的“非常简单的Shell菜单脚本”就是一种基础的Shell脚本应用,它创建了一个简单的菜单系统,使用户...

    Linux Shell 脚本基础

    本文将深入探讨Shell脚本的基础知识,包括基本语法、变量、控制结构、函数以及常用的内置命令。 首先,Shell脚本的开头通常会指定解释器,例如`#!/bin/bash`,这告诉系统使用Bash shell来执行脚本中的命令。在描述...

Global site tag (gtag.js) - Google Analytics