我想写的是接受输入的文本文件,其中包含由换行符separeted的bash命令,并执行在文本文件中的每个命令的程序Shellcode.c:例如,文本文件将包含:
echo Hello World
mkdir goofy
ls
我想这一个(刚开始与exec函数一个练习):
#include <stdio.h>
#include <unistd.h>
void main() {
char *name[3];
name[0] = "echo";
name[1] = "Hello World";
name[2] = NULL;
execvp("/bin/sh", name);
}
我得到的,作为回报,
echo: Can't open Hello World
我坚持与execvp的功能,为什么我有什么错?
你这样做是错的。
第一阵列索引是程序的名称,如在该文档解释 :
的execv(),execvp(),和execvpe()函数提供指针来表示可用的新程序的参数列表空终止字符串数组。 第一个参数,按照惯例,应该指向与正在执行的文件相关联的文件名。 指针数组必须由一个NULL指针被终止。
此外,庆典并不指望自由形式的说法一样,你需要告诉它你要通过使用命令-c
选项:
所以,你需要:
name[0] = "sh";
name[1] = "-c";
name[2] = "echo hello world";
name[3] = NULL;
要通过脚本来砸在命令行中必须添加选项“-c”,并通过整个脚本作为一个字符串,即
#include <stdio.h>
#include <unistd.h>
void main() {
char *name[] = {
"/bin/bash",
"-c",
"echo 'Hello World'",
NULL
};
execvp(name[0], name);
}
这里的许多问题: exec()
函数族不执行多个程序-这些函数执行一个程序,并用新节目替换当前运行的进程在内存中。 传递给字符串的空指针终止阵列execvp
应该包含的命令行参数来通过执行的程序execvp
。
如果要执行多个程序,你需要遍历各行,并通过一个执行程序之一。 但你不能使用execvp
因为马上通过shell中执行的过程中替换当前执行的进程(C程序),这意味着你的C程序的其余部分将永远不会被执行。 你需要学习如何使用fork()
联合execvp
这样你就可以执行子进程。 首先调用fork()
创建子进程,然后从你所说的子进程execvp
。 叉+ Exec的是一个共同的战略在UNIX环境中从父进程启动其他程序。