【发布时间】:2012-10-05 19:13:19
【问题描述】:
因此,对于课堂作业,我们正在制作自己的基本外壳。在其他功能中,它必须能够处理绝对路径并使用 fork() 和 execv 执行外部应用程序。
这个想法是程序派生一个子进程,调用 execv 替换所述子进程,并在外部执行完成时终止它。
不幸的是,我错过了这门课,我尝试了几个我在网上找到的例子,但都没有奏效。问题是父进程复制 execv 命令并自行终止。现在我只是想让它执行“/bin/ls”并返回到shell的主循环。
这是有问题的代码。我想我错过了一些简单的东西。是的,这对教授来说是个好问题,但他不遵守周五的办公时间,我不想等待数小时或数天才能收到电子邮件回复。 :P 同样,我知道我应该实施更好的错误检查。现在我将使用基本功能,稍后我会添加花里胡哨的功能。
我已确认以下所有变量都有其正确的值。问题是我如何只导致子进程在 execv 之后关闭并防止父进程这样做?
TLDR:自学如何使用 fork/execv,却发现自己一无所知。
161 pid_t child = fork();
162
163 if(child != -1)
164 if(token[0] == '.' || token[0] == '/')
165 if(access(token, X_OK) == 0) {
166 char** charArgs = toCharMatrix(args);
167 execv(token, charArgs);
169 }
【问题讨论】:
-
你要根据fork返回的pid来区分父子。目前您说的是“如果 fork 没有失败,请执行两个进程。”子进程将以 pid == 0 从 fork 返回。您可能希望在父进程中等待()。
标签: c linux process fork execv