通过execlp函数传递参数的麻烦 - C.

时间:2017-11-26 18:01:11

标签: c fork

我正在使用给定的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程序,我得到了正确的执行。

出了什么问题?救命啊!

2 个答案:

答案 0 :(得分:1)

以下提议的代码:

  1. 干净地编译
  2. 记录每个头文件包含的原因
  3. 使用对execl()而不是execlp()的正确调用,因为execl()期望第一个参数是完整路径,而execlp()期望第一个参数只是一个文件名称
  4. 正确格式化代码,以便于阅读和理解
  5. 正确处理呼叫execl()并可能导致该呼叫失败
  6. 使用stderr正确地将错误消息传递给stdout而不是perror(),因此系统认为发生错误的原因也显示在stderr上。
  7. 现在,建议的代码:

    #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创建一个全新的流程论证的路径仍然相对于父流程,这就是为什么不起作用的原因。经过几次头痛,我终于意识到了这一点。谢谢大家!