我正在使用给定的md5函数,当您使用文件地址提供文件时,它会计算文件哈希值。事情是,我需要使用fork()执行此程序,然后使用任何exe ...()函数加载它(我尝试使用execlp()),但当我这样做,我传递单个参数,我需要计算哈希失败了。我尝试使用我在execlp中使用的确切参数手动运行md5程序并且它没有失败所以我只是假设它必须是execlp参数的错误。这是我用来解释场景的一个例子:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(){
pid_t cpid;int status;
cpid = fork();
if(cpid < 0){
printf("Error fork\n");
exit (EXIT_FAILURE);
}else if (!cpid){
if (execlp("./hashMD5/me/md5","md5","testfile.a",(char*)NULL) == -1){
printf("Error: Loading process\n");
exit(EXIT_FAILURE);
}
}else{
waitpid(cpid,&status,0);
}
exit (EXIT_SUCCESS);
}
当我使用它时,我在终端出现错误:
$testfile.a can't be opened
但如果我用完全相同的参数手动执行md5程序,我得到了正确的执行。
出了什么问题?救命啊!
答案 0 :(得分:1)
以下提议的代码:
execl()
而不是execlp()
的正确调用,因为execl()
期望第一个参数是完整路径,而execlp()
期望第一个参数只是一个文件名称execl()
并可能导致该呼叫失败stderr
正确地将错误消息传递给stdout
而不是perror()
,因此系统认为发生错误的原因也显示在stderr
上。现在,建议的代码:
#include <stdio.h> // perror()
#include <sys/types.h>
#include <stdlib.h> // exit(), EXIT_FAILURE, EXIT_SUCCESS
#include <unistd.h> // fork(), execlp()
#include <sys/wait.h> // waitpid()
int main( void )
{
pid_t cpid;int status;
cpid = fork();
if(cpid < 0)
{ // error
perror("Error fork\n");
exit (EXIT_FAILURE);
}
else if (!cpid)
{ // child
execl("./hashMD5/me/md5","md5","testfile.a", NULL);
perror("Error: Loading process\n");
exit(EXIT_FAILURE);
}
else
{ // parent
waitpid(cpid,&status,0);
}
exit (EXIT_SUCCESS);
}
答案 1 :(得分:0)
我终于解决了这个问题。我很欣赏人们给我的改进,我总是乐于学习新事物!
问题在于论证本身:即使你使用execlp创建一个全新的流程论证的路径仍然相对于父流程,这就是为什么不起作用的原因。经过几次头痛,我终于意识到了这一点。谢谢大家!