我是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
?指针是什么?在那里什么零?
答案 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 *)0
是char*
类型的空指针。这里没有什么神奇的东西,值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>