即使可执行文件存在,C`execlp`也会下降

时间:2013-12-29 14:26:06

标签: c binary executable system-calls

我是C的新手。我和史蒂文斯一起学习UNIX拉戈书。我有一个问题。其中一个早期的数字在我的实现中不起作用。

#include "apue.h"                                     
#include <sys/wait.h>                                 

int                                                   
main(void)                                            
{                                                     
  char buf[MAXLINE];                                  
  pid_t pid;                                          
  int status;                                         

  printf("%% ");                                      
  while (fgets(buf, MAXLINE, stdin) != NULL) {        
    if (buf[strlen(buf) - 1] == "\n")                 
      buf[strlen(buf) - 1] = 0;                       

    if ((pid = fork()) < 0) {                         
      err_sys("Fork error: %d");                      
    }                                                 
    else if ((pid == 0) && (access(buf, F_OK ) != 1)){ /* Here I have an extra check to ensure, that the binary exists. */
      execlp(buf, buf, (char *)0);                    
      err_ret("Couldn't execute: %s", buf);           
      exit(127);                                      
    }                                                 

    if ((pid = waitpid(pid, &status, 0)) < 0)         
      err_sys("waitpid error");                       
    printf("%% ");                                    
  }                                                   
  exit(0);                                            
}                                                     

当我启动程序时:

$ ./exec
% /bin/ls
Couldn't execute: /bin/ls
: No such file or directory

我有几个关于execlp(buf, buf, (char *)0);的问题:

为什么execlp无法执行二进制文件?

  

int execlp(const char * file,const char * arg,...);

为什么buf过了两次?如果第二个参数必须是二进制的参数。 我找不到,这是什么意思:(char *)0?指针是什么?在那里什么零?

2 个答案:

答案 0 :(得分:3)

Couldn't execute: /bin/ls
: No such file or directory

请注意,错误消息在新行上,但您尝试从输入中删除行尾字符。所以你的移除似乎不起作用。

原因是:

if (buf[strlen(buf) - 1] == "\n")

您将字符(buf[x])与字符串("\n")进行比较,即指针。打开编译器的警告并仔细阅读。

请改为尝试:

if (buf[strlen(buf) - 1] == '\n')

its man page中描述了execlp的参数:

  

按照惯例,第一个参数应指向与正在执行的文件关联的文件名。

或者在POSIX here中。

(char *)0char*类型的空指针。这里没有什么神奇的东西,值0的整数常量是一个空指针常量。但由于execlp是一个可变函数,所以强制转换是必要的 - 否则,常量零将被视为int,其可能与指针的大小不同(以及null的内部表示) -pointer可能与整数0)不同,导致未定义的行为。

答案 1 :(得分:0)

你的代码是对的我只是编译,除了。不要使用双引号(“)只在这样的单引号中使用

buf[strlen(buf) - 1] == '\n'

还包括此

#include<stdio.h>
#include<stdlib.h>

#include<unistd.h>

#include<string.h>