我正在编写类似shell的程序,并且在TryParse
函数调用中不断出现错误。
以下是核心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
我在MacOS High Sierra上使用#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);
}
进行编译:
llvm
我错过了什么?
答案 0 :(得分:1)
同时,execlp()
的第二个参数参数和任何后续参数对应于在其参数向量中提供给新程序的main()
函数的字符串。它们都必须是指向以null结尾的C字符串的指针,除了列表的末尾必须由类型为char *
的空指针标记。例如:
execlp(buffer, buffer, (char *) NULL);
这是对此函数的参数的文档要求,如果您不满足它,您的程序邮件将失败。如果您愿意,您可以将其合理化,为系统提供计算参数向量元素的方法,以便将该数字传递给新的main()
。您还可以考虑将参数向量本身记录为由空指针终止。