如何在自己写的 Linux C 程序中以一种优雅的方式调用一些命令Linux C编程启动另一个可执行文件或调用命令用system函数最理想了,这个函数原理是在你编写的那个程序的内部启动另一个程序或命令,从而创建一个新进程 , 并等待这个进程执行完毕退出 。如果正常执行 , system函数将返回被执行程序或命令的退出码;如果无法运行这个程序或命令,将返回错误代码127;如果是其他错误,返回-1 。这个函数的原型是:
#include stdlib.h
int system(const char *string);
参数string是将要执行的程序或命令的命令字符串 。
还有一种执行外部程序的方法是exec系列函数,但这个系列的函数都是将当前进程的替换成新进程,也就是说新进程启动后原来的进程就不存在了 , exec系列函数后面的那些代码就不会再执行了 。所以我一般是用system函数调用Linux命令 。
如何在C语言编程中调用linux系统终端下的命令system(执行shell 命令)
相关函数 fork,execve,waitpid,popen
表头文件 #includestdlib.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()会继承环境变量,通过环境变量可能会造成系统安全的问题 。
范例 #includestdlib.h
main()
{
system(“ls -al /etc/passwd /etc/shadow”);
}
执行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow
linux下怎样用c语言调用shell命令//使用popen()函数和pclose()函数,具体使用示例如下:
FILE *fp;
char cmd[]="ls -l";//以ls -l命令为例
char buf[1024];
if((fp=popen(cmd,"r")) == NULL)
{
printf("popen() failed:%s",strerror(errno));
return -1;
}
fread(buf,1,sizeof(buf),fp); //将fp数据流读取到buf中
printf("%s\n",buf);//在屏幕中显示ls -llinuxc调用命令的执行结果
pclose(fp); //关闭文件流fp
这里linuxc调用命令我只是写了最核心的代码,希望对你有所帮助 。
Linux下的c编程:系统调用标准的c函数库是所有的编译都要具有的函数库,(实际上还是略有不同),但是这些基本上实现方法略有不同,但是结果和标准是一样的 。但是linux的系统调用,调用是linux的系统库,比如说unistd.h下的fork这个是Linux下特有,你在vs上,就没有这个库,也没有这个函数 。同样在vs上写c,你可以引入头文件比如windows.h,显然这个库是Linux不具有的 。简单说系统调用库根据具体的操作系统环境不同而不同,而c标准库,是所有支持c语言编译器都有的 。
linux下如何用c语言调用shell命令参数type可使用“r”代表读取linuxc调用命令,“w”代表写入 。依照此type值,popen()会建立管道连到子进程linuxc调用命令的标准输出设备或标准输入设备,然后返回一个文件指针 。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中 。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除linuxc调用命令了fclose()以外 。返回值:若成功则返回文件指针 , 否则返回NULL,错误原因存于errno中 。注意:在编写具SUID/SGID权限的程序时请尽量避免使用popen(),popen()会继承环境变量 , 通过环境变量可能会造成系统安全的问题 。例:C程序popentest.c内容如下: #includestdio.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$ 只是偶能力可能有点有限,没有太看懂 。直接用system()倒是脚本可是执行,只是返回值却是一塌糊涂,试了多次也没有找到什么规律 。不免又看了一下上面的那篇博文,得到一些启发,可以这样来实现: 先将脚本的返回值利用 echoXXXXX 输出到一个本地文件中 当需要这个返回值是,可是通过C语言的文件操作函数来直接从文件中读取 后来一想,这应该就是上文中POPEN的实现方法! C程序调用shell脚本共有三种法子 :system()、popen()、exec系列函数 system() 不用你自己去产生进程 , 它已经封装了,直接加入自己的命令exec 需要你自己 fork 进程,然后exec 自己的命令 popen() 也可以实现执行你的命令 , 比system 开销小 1)system(shell命令或shell脚本路径); system()会调用fork()产生 子历程,由子历程来调用/bin/sh-c string来履行 参数string字符串所代表的命令,此命令履行 完后随即返回原调用的历程 。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被漠视。返回值:如果system()在调用/bin/sh时失败则返回127,其linuxc调用命令他失败原因返回-1 。若参数string为空指针(NULL),则返回非零值 。如果 system()调用成功 则最后会返回履行 shell命令后的返回值 , 但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因 此最好能再反省 errno 来确认履行 成功。system命令以其简略 高效的作用得到很很广泛 的利用,下面是一个例子 例:在~/test/目录下有shell脚本test.sh,内容为 #!bin/bash #test.sh echo hello 在同层目录下新建一个c文件system_test.c,内容为: #includestdlib.h int main() { system("~/test/test.sh"); } 履行 效果 如下: [root@localhost test]$gcc system_test.c -o system_test [root@localhost test]$./system_test hello [root@localhost test]$ 2)popen(char *command,char *type) popen()会调用fork()产生 子历程,然后从子历程中调用/bin/sh -c来履行 参数command的指令 。参数type可应用 “r”代表读取 , “w”代表写入 。遵循此type值,popen()会建立 管道连到子历程的标准 输出设备 或标准 输入设备 ,然后返回一个文件指针 。随后历程便可利用 此文件指针来读取子历程的输出设备 或是写入到子历程的标准 输入设备 中 。此外,所有应用 文 件指针(FILE*)操作的函数也都可以应用 ,除了fclose()以外 。返回值:若成功 则返回文件指针,否则返回NULL,差错 原因存于errno中 。
推荐阅读
- erp系统在电商物流行业的用途,erp在物流过程中的作用
- 嗯小什么电视,有个电视剧叫小什么
- 小米手机虚拟机安装apk,虚拟机安装小米系统
- java统计字符个数代码 java统计各种字符个数
- linux修改redis端口,如何修改redis端口
- 如何写好推广策划方案心得,推广策划方案怎么写
- 如何下载女皇养成计划游戏,女皇养成记最新版本下载
- java代码自身加2的简单介绍
- 天津市sap培训,天津市sap培训机构