我非常了解 C 编程,但我对 Unix 系统调用没有太多经验。很长一段时间后,我正在重新探索我的 Unix 知识。所以我从 fork 和 execlp 系统调用开始。我在 ubuntu_linux 上练习示例。
这是一个教科书示例程序,它接受来自 STD_IN 的命令并在子进程中执行它。
int main (int argc, char *argv[]) {
char command[MAX_LINE];
pid_t pid;
int status;
printf ("%% ");
while (fgets (command,MAX_LINE,stdin ) != NULL){
if (command[strlen(command)-1] == '\n')
command[strlen(command)-1] = '\0';
if ((pid=fork ()) < 0) {
perror ("fork failed : \n");
}
if (pid == 0) {
printf (" I am child and my PID is %d",getpid ());
execlp (command, command, (char *)0);
perror ("couldn't execute:");
exit(127);
}
printf (" I am parent and my PID is %d\n ",getpid ());
if ((pid = waitpid (pid, &status, 0)) < 0){
perror("waitpid error\n");
}
printf ("%% ");
}
exit (0);
}
我放了一些语句,但只要命令成功执行printf
,程序就不会打印“我是孩子,我的 PID 是”这一行。但是,如果输入命令不正确并且失败,它会打印上面的行。
我希望在这两种情况下都会打印该行,因为 print 语句是之前的execlp
。