我正在编写自己类似于shell的程序,并且我一直在exec*
函数调用上遇到错误。
这是核心processes.c
的源代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/uio.h>
#define BUFSIZE 128
#define EXIT_STR "exit"
int main(int argc, char ** argv) {
const char *prompt = "> ";
char buffer[BUFSIZE];
int bytes_read;
int status;
pid_t child_p;
while(1) {
printf("%s", prompt);
fflush(stdout);
bytes_read = read(0, buffer, BUFSIZE);
buffer[bytes_read-1] = '\0';
if(strncmp(EXIT_STR, buffer, bytes_read) == 0)
exit(0);
if((child_p = fork()) == 0) {
printf("[*] %d executing: %s\n", getpid(), buffer);
execlp(buffer, buffer);
printf("[*] %d got error on execlp\n", getpid());
exit(1);
} else {
waitpid(child_p, &status, 0);
printf("[*] child returned: %d\n", status);
}
}
}
我也有简单的other.c
程序进行测试:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv){
printf("Hello. I am %s with pid: %d\n", argv[0], getpid());
exit(0);
}
我在MacOS High Sierra上使用llvm
进行编译:
$ llvm-gcc processes.c -o processes -Wall
$ ./processes
> other
[*] 6040 executing: other
[*] 6040 got error on execl
[*] child returned: 256
> ls
[*] 6041 executing: ls
[*] 6041 got error on execl
[*] child returned: 256
> exit
我错过了什么?
同时,execlp()
的第二个参数参数和任何后续参数对应于在其参数向量中提供给新程序的main()
函数的字符串。它们都必须是指向以null结尾的C字符串的指针,除了列表的末尾必须用char *
类型的空指针标记。例如:
execlp(buffer, buffer, (char *) NULL);
这是对此函数的参数的文档要求,如果您不满足它,您的程序邮件将失败。如果您愿意,您可以将其合理化,为系统提供计算参数向量元素的方法,以便将该数字传递给新的main()
。您还可以考虑将参数向量本身记录为由空指针终止。