如何在C语言中执行shell命令

Python027

如何在C语言中执行shell命令,第1张

在c语言中调�”.shell命令的方法实现。c程序调用shell脚本共有两种方法:system()、popen(),分别如下:system()不用自己去创建进程,系统已经封装了这一步,直接加入自己的命令即可popen()也可以实现执行的命令,比system开销小以下分别说明:1)system(shell命令或shell脚本路径)system()会调用fork()产生子历程,由子历程来调用/bin/sh-cstring来履行参数string字符串所代表的命令,此命令履行完后随即返回原调用的历程。在调用system()期间sigchld信号会被暂时搁置,sigint和sigquit信号则会被漠视。返回值:如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(null),则返回非零值。如果system()调用成功则最后会返回履行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再反省errno来确认履行成功。system命令以其简略高效的作用得到很很广泛的利用,下面是一个例子例:在/tmp/testdir/目录下有shell脚本tsh.sh,内容为#!/bin/shwget$1echo"done!"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内容如下:#includemain{file*fpcharbuffer[80]fp=popen(“~/myprogram/test.sh”,”r”)fgets(buffer,sizeof(buffer),fp)printf(“%s”,buffer)pclose(fp)}

简单列举几点吧:1)shell变量没有固定类型,你可以给一个变量一会儿赋值为一个整数,一会儿赋值为一个字符串,都没关系;c程序变量需要在定义时明确指定类型,不同类型间需要做类型转换。2)由于shell程序是逐行按次序解释执行的,函数定义必须写在函数调用的前面;而C程序不必,在文件开头加上函数申明即可。3)相同的地方也有。作为编程语言,都有逻辑控制结构,如if语句、switch语句、while循环语句等。都有退出状态返回值。 总之,一个是脚本语言,一个是高级语言;一个是解释执行,一个是编译后执行。有天壤之别,没法比。

shell

script

属于脚本语言

是按解释执行的,由解释器来执行命令

C

是要编译成机器码的,直接执行命令

由于解释执行的缘故,脚本语言程序一般比编译型语言的程序慢

但不是绝对的,如果编译型语言的算法写得不好,效率也会很差的