问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在C语言中调用shell命令

发布网友 发布时间:2022-04-23 20:51

我来回答

4个回答

热心网友 时间:2023-09-17 06:27

C语言中调用shell指令,根据调用指令目的,可以区分如下两种情况:

一、需要shell指令执行某一功能,如创建文件夹,或者删除文件夹等,程序中不关注shell指令的输出,那么可以使用system函数。

system函数声明于stdlib.h, 功能为调用系统命令,形式为

int system(const char *cmd);

其中cmd为要执行的命令字符串,返回值为执行是否成功的标记。

比如在Linux下要删除当前文件夹下的所有扩展名为a的文件,即*.a, 可以写作

system("rm *.a -f");

二、不仅要执行shell命令,还需要得知运行的打印结果,并在程序中使用。

对于此,有两种方案:

1、用system命令,将输出重定向到一个txt文件中,执行后,再读取txt文件,使用后删除。

比如Linux下获取剩余内存的指令可以写作:

system("free>result.txt");//结果重定向到result.txt中。
FILE *fp = fopen("result.txt", "r");//打开文件。
int r;
while(fgetc(fp) != '\n'); //忽略第一行。
fscanf(fp, "%*s%*d%*d%d",&r);//读取第四个域的值,即剩余内存值。
printf("剩余内存为%d KB\n",r);//打印结果。
fclose(fp);//关闭文件。
unlink("result.txt");//删除临时文件。

2、使用重定向,需要经过磁盘读写,还要删除文件,相对低效。同时还有可能出现临时文件和已有文件重名,导致误删数据的情况。 所以一般使用更方便快捷的方式,即调用popen。

FILE *popen(const char *cmd, const char *mode);

使用popen的功能和system类似,属于方法1中执行命令和打开文件的一个组合。不过这里用到的文件是隐式的,并不会在系统中真正存在。返回的指针即结果文件指针。 当使用pclose关闭后,文件自动销毁。

方法1中的例子,用popen实现如下:

FILE *fp = popen("free", "r");//执行命令,同时创建管道文件。
int r;
while(fgetc(fp) != '\n'); //忽略第一行。
fscanf(fp, "%*s%*d%*d%d",&r);//读取第四个域的值,即剩余内存值。
printf("剩余内存为%d KB\n",r);//打印结果。
pclose(fp);//关闭并销毁管道文件。

三、注意事项:

虽然调用shell命令有时可以大大减少代码量,甚至有千行代码不如一句shell的说法,不过调用shell命令还是有局限性的:

1、使用shell命令会调用系统资源,效率偏低;

2、不同平台的shell指令不同,导致可移植性下降;

3、调用shell命令时会复制当前进程(fork),如果当前进程的资源占有比较大,会导致瞬间资源占用极大,甚至可能出现失败。

所以,在编码时,除非是测试性的代码,否则在正式代码中不建议使用shell。

热心网友 时间:2023-09-17 06:27

1、system(执行shell 命令)

相关函数 fork,execve,waitpid,popen
表头文件 #include<stdlib.h>
定义函数 int system(const char * string);
函数说明 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()会
继承环境变量,通过环境变量可能会造成系统安全的问题。

#include<stdlib.h>
main()
{
system(“ls -al /etc/passwd /etc/shadow”);
}

2、popen(建立管道I/O)

相关函数 pipe,mkfifo,pclose,fork,system,fopen
表头文件 #include<stdio.h>
定义函数 FILE * popen( const char * command,const char * type);
函数说明 popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c
来执行参数command的指令。参数type可使用“r”代表读取,“w”
代表写入。依照此type值,popen()会建立管道连到子进程的标准输
出设备或标准输入设备,然后返回一个文件指针。随后进程便可利
用此文件指针来读取子进程的输出设备或是写入到子进程的标准输
入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使
用,除了fclose()以外。
返回值 若成功则返回文件指针,否则返回NULL,错误原因存于errno中。
错误代码 EINVAL参数type不合法。
注意事项 在编写具SUID/SGID权限的程序时请尽量避免使用popen(),popen()
会继承环境变量,通过环境变量可能会造成系统安全的问题。

#include<stdio.h>
main()
{
FILE * fp;
char buffer[80];
fp=popen(“cat /etc/passwd”,”r”);
fgets(buffer,sizeof(buffer),fp);
printf(“%s”,buffer);
pclose(fp);
}

执行 root :x:0 0: root: /root: /bin/bash



3、使用vfork()新建子进程,然后调用exec函数族

#include<unistd.h>
main()
{
   char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) };
  
   if(vfork() = =0)
   {
       execv(“/bin/ls”,argv);
   }else{        
       printf(“This is the parent process\n”);
   }
}

热心网友 时间:2023-09-17 06:28

可以通过system函数,调用shell命令。
1 函数原型:
int system(const char *cmd);
2 功能:
调用cmd内容的系统命令,即shell命令。
3 头文件:
stdlib.h
4 举例:
system("ls");
打印当前工作目录下的文件。

热心网友 时间:2023-09-17 06:28

在linux操作系统中,很多shell命令使用起来非常简单,这些shell命令的程序实现已经被底层实现好。有时候需要在程序中调用shell命令,这样可以就不用在控制台上手动输入shell命令了,下面就以三个函数为例来讲解如何在C语言中调用shell命令。
1、system(执行shell 命令)
相关函数 fork,execve,waitpid,popen
表头文件 #include<stdlib.h>
定义函数 int system(const char * string);
函数说明 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()会
继承环境变量,通过环境变量可能会造成系统安全的问题。
范例:

#include<stdlib.h>
main()
{
system(“ls -al /etc/passwd /etc/shadow”);
}

2、popen(建立管道I/O)
相关函数 pipe,mkfifo,pclose,fork,system,fopen
表头文件 #include<stdio.h>
定义函数 FILE * popen( const char * command,const char * type);
函数说明 popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c
来执行参数command的指令。参数type可使用“r”代表读取,“w”
代表写入。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
昭君怨诗词大全(5首昭君怨古词) 道是春来花未,道是雪来香异。竹外一枝斜,野人家。词中吟诵的是 萌萌带着自己的压岁钱去买笔记本,买了2本后还剩1.8元。如果买同样的笔记... ...1.8元,买同样的作业本四本差2.4元,作业本多少钱一本。给算得方法说... ...如果买同样的硬面钞4本则差2.40元,那么小明带了多少钱? 小明带一些钱去买作业本,买两本之后还剩1.8元;如果买同样的练习本4本则... 我的QQ总是被盗,烦死了,我总要改密码,怎样才不会被盗密码? 我跟一个好兄弟绝交了有1年9个月,没有联系没有来往,但我的心一直惦记... ...了。最近他听说我生病做手术回来了,就去班长那里问我的近况,加我... 请问神舟七号载人航天飞行的圆满成功,将对我国经济产生哪些积极影响... 能将c语言的预计用在shell脚本中吗,它的执行需要经过编译链接吗,为什么 linux C编程中怎样调用shell命令 如何将c语言的变量传递给shell脚本使用 在c\c++程序里怎么执行shell脚本命令? 如何在C语言中执行shell命令 C语言能否用在shell脚本 c语言如何调用需传入参数的shell脚本 口碑最好的老人手机是什么? 华为nova5换内外屏多少钱? 华为手机通讯录的根目录在哪 固态硬盘带缓存和不带缓存的区别 华为手机的通讯录,放在哪个文件夹里 华为手机的通讯录在哪里 华为手机默认联系人和短信储存在什么位置? 华为手机通讯录权限在哪里打开 华为手机上的联系人在哪个文件夹里,我想找到文件夹,把里面的联系人拷... 苹果手机截完屏怎么立马保存 vivo手机截完屏以后怎样局部截屏 截屏问题,截完屏,图片在手机上停留时间太长怎么解决? 买的鸡肉有点味道了,怎么处理味道 能将c语言的语句用在shell脚本吗他的执行需要经过编译链接吗为什么 在Linux C语言下,可执行的Shell脚本文件与编译之后的C可执行文件的区别有哪些 ? 在 shell脚本中调用一个C语言的可执行程序,如何将C程序中printf的字符保存成到文件中? 学习先锋事迹的感受短30字? 读了许振超的事迹后,你有何感想? 学习英雄模范主要事迹有什么感悟 求几篇学习 先进事迹 的 心得体会学习 *** 先进事迹心得体会 学习了 *** 同志的先进事迹 求一篇学习先进典型、增强团队执行力心得 学习先锋事迹的感受怎样写? 关于学习廖俊波同志的先进事迹心得体会 推荐几个hiphop的视频 学习黄文秀同志先进事迹心得体会01 hip-hop是什么舞蹈? ghetto style,它是hiphop舞蹈的一个什么风格? hiphop和breaking有什么区别,breaking不是属于hiphop吗? HIPHOP和爵士的区别。 我想知道hiphop舞蹈的历史、动作名称等内涵知识 HIPHOP共有几类?街舞有哪几种? HIPHOP与街舞有什么不同?\ hiphop街舞要怎么练习?动作基本要领有哪些?