繁体   English   中英

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

[英]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程序,则会得到正确的执行。

怎么了? 救命!

以下建议的代码:

  1. 干净地编译
  2. 说明为什么包含每个头文件
  3. 使用对execl()而不是execlp()的正确调用,因为execl()期望第一个参数是完整路径,而execlp()期望第一个参数只是文件名。
  4. 正确格式化代码,以便于阅读和理解
  5. 正确处理调用execl()和该调用的可能失败
  6. 使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM