使用 execvp 将 md5sum 重定向到文件?
Redirect md5sum to a file using execvp?
我需要在 C 项目中使用 md5sum 获取文件的校验和。
我无法使用 openssl 库,因为它没有安装,我也无法安装它,因为它是我正在使用的大学服务器。
我还有一些要求,我不能使用system(),这很简单,只需:system("md5sum fileName > testFile");
他们也不允许我使用 popen();
我正在尝试使用 execvp 让它工作,但它实际上并没有工作,我不知道我是否真的可以工作。
我实际使用的测试文件是这样的:
int main(){
char *const args[] = {"md5sum","file"," > ","test", NULL};
execvp(args[0],args);
return 0;
}
当我打开文件时 "test" 那里没有任何内容,
关于如何操作或为什么不起作用的任何线索?
提前致谢。
>
由 shell 处理,它不是您 运行 和 execvp
.
的程序参数
在调用 execvp
之前重定向进程的 stdout
。
int main(){
char *const args[] = {"md5sum", "file", NULL};
int fd = open("test", O_WRONLY, 0777);
dup2(fd, STDOUT_FILENO);
close(fd);
execvp(args[0], args);
return 0;
}
您正在将 >
作为参数传递给命令。通常编写 command > file
是有效的,因为您正在使用的 shell 将 >
解析为重定向符号并将程序的标准输出重定向到文件( >
永远不会传递给命令本身)。
你想做的是
int main()
{
const char* args[]={"md5sum","file",0};
int fd=open("test",O_CREAT|O_WRONLY,S_IRWXU);
pid_t pid=fork();
if(!pid)
{
dup2(fd,STDOUT_FILENO);
close(fd);
execvp(agrs[0],args);
}
// ...
}
我需要在 C 项目中使用 md5sum 获取文件的校验和。
我无法使用 openssl 库,因为它没有安装,我也无法安装它,因为它是我正在使用的大学服务器。
我还有一些要求,我不能使用system(),这很简单,只需:system("md5sum fileName > testFile");
他们也不允许我使用 popen();
我正在尝试使用 execvp 让它工作,但它实际上并没有工作,我不知道我是否真的可以工作。
我实际使用的测试文件是这样的:
int main(){
char *const args[] = {"md5sum","file"," > ","test", NULL};
execvp(args[0],args);
return 0;
}
当我打开文件时 "test" 那里没有任何内容,
关于如何操作或为什么不起作用的任何线索?
提前致谢。
>
由 shell 处理,它不是您 运行 和 execvp
.
在调用 execvp
之前重定向进程的 stdout
。
int main(){
char *const args[] = {"md5sum", "file", NULL};
int fd = open("test", O_WRONLY, 0777);
dup2(fd, STDOUT_FILENO);
close(fd);
execvp(args[0], args);
return 0;
}
您正在将 >
作为参数传递给命令。通常编写 command > file
是有效的,因为您正在使用的 shell 将 >
解析为重定向符号并将程序的标准输出重定向到文件( >
永远不会传递给命令本身)。
你想做的是
int main()
{
const char* args[]={"md5sum","file",0};
int fd=open("test",O_CREAT|O_WRONLY,S_IRWXU);
pid_t pid=fork();
if(!pid)
{
dup2(fd,STDOUT_FILENO);
close(fd);
execvp(agrs[0],args);
}
// ...
}