0
我非常了解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
statments但节目没有打印行“我的孩子和我的PID为”每当命令执行成功。但是,如果输入命令不正确并且失败,它将打印上面的行。
由于打印语句在execlp
之前,我期待在这两种情况下打印该行。
您可能希望在execlp之前刷新printf,即fflush(stdout)并查看所得结果。 –
为什么你总是打印错误并迫使你的孩子退出失败? – Anycorn
@ApprenticeQueue:我知道fflush会解决它的问题。但程序正在显示printf之后的perror的输出。在这里,stdout和stderr都只指向控制台。 – Sach