开发者社区> hopegrace> 正文

在C语言中执行shell命令

简介: 在C语言中执行shell命令 1、system系统调用 int system(const char * string); system()会调用fork()产生子进程,由子进程来调用/bin/sh -c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。
+关注继续查看

C语言中执行shell命令

1、system系统调用

int system(const char * string);

system()会调用fork()产生子进程,由子进程来调用/bin/sh -c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置SIGINTSIGQUIT 信号则会被忽略。

返回值 如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。

在编写具有SUID/SGID权限的程序时请勿使用system()system()会继承环境变量,通过环境变量可能会造成系统安全的问题。Use the exec(3) family of functions instead, but not execlp(3) or execvp(3).

#include<stdlib.h>

int main()

{

system("ls -al /data/myname");

return 1;

}

2popen(建立管道I/O

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);

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

Since a pipe is by definition unidirectional, the type argument may specify only reading or writing, not both; the resulting stream is correspondingly read-only or write-only.

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

在编写具SUID/SGID权限的程序时请尽量避免使用popen()popen()会继承环境变量,通过环境变量可能会造成系统安全的问题。

#include<stdio.h>

int main()

{

FILE *fp;

char buffer[80];

fp=popen("cat /etc/passwd","r");

fgets(buffer,sizeof(buffer),fp);

printf("%s",buffer);

pclose(fp);

return 0;

}

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

#include "unistd.h"

#include "stdio.h"

int main()

{

char *argv[] = {"ls", "-al", "/etc/passwd", "char*"};

if(vfork() == 0)

{

execv("/bin/ls", argv);

}

else

{

printf("parent.\n")

}

return 0;

}

原文

[1]http://www.cnblogs.com/niocai/archive/2011/07/20/2111896.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
shell脚本中执行python脚本,处理字符串,同时复制到剪贴板
shell脚本中执行python脚本,处理字符串,同时复制到剪贴板
73 0
Java执行shell命令
java执行shell命令的方式有很多种,但是在应用的过程中,我们可能会遇上一些特殊的情况,导致执行脚本失败,不生效的场景。
80 0
shell命令执行hive脚本
shell命令执行hive脚本
43 0
Python编程:sh模块执行shell命令
Python编程:sh模块执行shell命令
42 0
设置shell脚本执行错误自动退出
设置shell脚本执行错误自动退出
232 0
在windows上写的shell到linux执行时报错
在windows上写的shell到linux执行时报错
40 0
【Linux】小而美脚本:在多台服务器同时执行 shell 命令
【Linux】小而美脚本:在多台服务器同时执行 shell 命令
49 0
通过shell的&命令执行“./startup.sh & tail -f ../logs/catalina.out”时造成tomcat的所属的jvm关闭并且对于的服务挂掉了
通过shell的&命令执行“./startup.sh & tail -f ../logs/catalina.out”时造成tomcat的所属的jvm关闭并且对于的服务挂掉了
69 0
在 Go 语言中使用 exec 包执行 Shell 命令(下)
exec 是 os 包中的一个子包,它可用于使用 Go 运行外部命令。Go exec 命令教程展示了如何在 Golang 中执行 shell 命令和程序。
126 0
在 Go 语言中使用 exec 包执行 Shell 命令(上)
exec 是 os 包中的一个子包,它可用于使用 Go 运行外部命令。Go exec 命令教程展示了如何在 Golang 中执行 shell 命令和程序。
153 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Shell 脚本速查手册
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载