我的程序应该使用fork和exec系统调用。 exec应更改子进程,以便将另一个命令作为参数并执行该命令。例如,显示当日消息:fork和execve分段错误
./myexec cat /etc/motd
这是我当前的代码
extern char **environ; /* environment info */
main(int argc, char **argv) {
/* argc -- number of arguments */
/* argv -- an array of strings */
char *argvNew[argc + 1];
int pid;
for(int i=0; i<argc; i++){
argvNew[i] = argv[i];
}
argvNew[argc + 1] = NULL;
printf("After For: %s\n",argvNew[0]);
printf("After For: %s\n",argvNew[1]);
printf("After For: %s\n",argvNew[2]);
printf("After For: %s\n",argvNew[3]);
if ((pid = fork()) < 0) {
fprintf(stderr, "Fork error%sstrerror\n", strerror(errno));
exit(1);
}
else if (pid == 0) {
/* child process */
if (execve(argvNew[0], argvNew, environ) < 0) {
fprintf(stderr, "Execve error%d %s\n",errno,strerror(errno));
exit(1);
}
}
else {
/* parent */
wait(0); /* wait for the child to finish */
}
}
运行./myexecv cat etc/motd
没有任何反应后,只是打印报表。任何建议前进?
绝对不需要复制参数列表。除非有一个正式的命令来使用'execve()'而不是'execv()',那就使用它。你的整个代码应该是:'execv(argv [1],&argv [1]);' - 没有分支,没有拷贝,没有等待,没有别的。原始代码中fork/exec/wait机制的唯一边际'好处'是来自父代的返回代码始终为0,无论执行的命令是否成功(假设您使用C99或更好的编译器,关闭main的结尾相当于'return 0',但是'main'应该有一个明确的'int'返回类型)。 –
谢谢你的回答。然而,在写入命令后仍然没有任何反应。我得到的输出是@ubuntu:〜/ Documents $ ./myfork ls -l 适用于:ls 适用于:-l 适用于:(null) 适用于:(null) 执行错误2无此类文件或目录 – SolRac
啊...使用'execv()'或'execve()',您必须指定可执行文件的绝对名称(或相对于当前目录的名称)。试试:'./myexec/bin/cat/etc/motd'(或者'./myexec/usr/bin/cat/etc/motd',如果这是'cat'的话)。这应该工作。要执行类似于shell的基于PATH的'cat'搜索,可以使用'execvp()' - 或者,如果你能找到代码并且你真的想要['execvpe()'](http:// stackoverflow。 com/questions/7789750),但由于您不改变环境,因此使用环境设置变体确实没有意义。 –