[英]Troubles passing arguments through execlp function - C
我正在使用给定的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程序,则会得到正确的执行。
怎么了? 救命!
以下建议的代码:
execl()
而不是execlp()
的正确调用,因为execl()
期望第一个参数是完整路径,而execlp()
期望第一个参数只是文件名。 execl()
和该调用的可能失败 perror()
正确地将错误消息传递给stderr
而不是stdout
,因此系统认为发生错误的原因也显示在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);
}
我终于解决了问题。 我感谢人们给我的进步,我总是很高兴学习新事物!
问题在于参数本身:即使当您使用execlp创建一个全新的进程时,参数的路径仍然相对于父进程而言 ,这就是为什么不起作用的原因。 经过几次头痛之后,我终于意识到了这一点。 谢谢大家!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.