如何在 Linux 中用 C 执行 shell 脚本?
- 2024-10-25 08:42:00
- admin 原创
- 95
问题描述:
如何在 Linux 中用 C 语言执行 shell 脚本?
解决方案 1:
这取决于您想用脚本(或您想运行的任何其他程序)做什么。
如果您只想运行脚本system
,这是最简单的事情,但它还会执行一些其他操作,包括运行 shell 并让其运行命令(大多数 *nix 下为 /bin/sh)。
如果您想要通过其标准输入提供 shell 脚本或使用其标准输出,则可以使用popen
(和pclose
) 设置管道。这也会使用 shell(大多数 *nix 下为 /bin/sh)来运行命令。
这两个都是库函数,在后台执行很多操作,但如果它们不能满足您的需求(或者您只是想尝试和学习),您也可以直接使用系统调用。这还可以避免让 shell (/bin/sh) 为您运行命令。
感兴趣的系统调用是fork
、execve
和waitpid
。您可能想要使用其中一个库包装器execve
(键入man 3 exec
以获取它们的列表)。您可能还想使用其他等待函数之一(拥有它们全部)。此外,您可能对与 fork 相关的系统调用和man 2 wait
感兴趣。clone
`vfork`
fork
复制当前程序,唯一的主要区别是新进程从 fork 调用中返回 0。父进程返回新进程的进程 ID(或错误)。
execve
用新程序替换当前程序(保持相同的进程ID)。
waitpid
由父进程用来等待特定子进程完成。
将 fork 和 execve 步骤分开允许程序在创建新进程之前对其进行一些设置(而不会弄乱自身)。这些设置包括将标准输入、输出和 stderr 更改为与父进程使用的文件不同的文件、更改进程的用户或组、关闭子进程不需要的文件、更改会话或更改环境变量。
pipe
您可能还对和系统调用感兴趣dup2
。 pipe
创建一个管道(具有输入和输出文件描述符)。 dup2
将文件描述符复制为特定文件描述符(dup
类似,但将文件描述符复制到最低可用文件描述符)。
解决方案 2:
您可以使用system
:
system("/usr/local/bin/foo.sh");
这将在使用时阻塞sh -c
,然后返回状态代码。
解决方案 3:
如果你对 POSIX 满意,你也可以使用popen()
/pclose()
#include <stdio.h>
#include <stdlib.h>
int main(void) {
/* ls -al | grep '^d' */
FILE *pp;
pp = popen("ls -al", "r");
if (pp != NULL) {
while (1) {
char *line;
char buf[1000];
line = fgets(buf, sizeof buf, pp);
if (line == NULL) break;
if (line[0] == 'd') printf("%s", line); /* line includes '
' */
}
pclose(pp);
}
return 0;
}
解决方案 4:
一个简单的方法是.....
#include <stdio.h>
#include <stdlib.h>
#define SHELLSCRIPT "\n#/bin/bash
\necho \"hello\"
\necho \"how are you\"
\necho \"today\"
\n"
/*Also you can write using char array without using MACRO*/
/*You can do split it with many strings finally concatenate
and send to the system(concatenated_string); */
int main()
{
puts("Will execute sh with the following script :");
puts(SHELLSCRIPT);
puts("Starting now:");
system(SHELLSCRIPT); //it will run the script inside the c code.
return 0;
}
向Yoda表示感谢@http: //www.unix.com/programming/216190-putting-bash-script-c-program.html
解决方案 5:
如果你需要更精细的控制,你也可以选择这种fork
pipe
exec
方式。这将允许你的应用程序检索从 shell 脚本输出的数据。
解决方案 6:
我更喜欢 fork + execlp,因为如 doron 所说,它可以实现“更精细的”控制。示例代码如下所示。
将您的命令存储在字符数组参数中,并为结果分配空间。
int fd[2];
pipe(fd);
if ( (childpid = fork() ) == -1){
fprintf(stderr, "FORK failed");
return 1;
} else if( childpid == 0) {
close(1);
dup2(fd[1], 1);
close(fd[0]);
execlp("/bin/sh","/bin/sh","-c",parameters,NULL);
}
wait(NULL);
read(fd[0], result, RESULT_SIZE);
printf("%s
",result);
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件