Я читаю Прикладное программирование GNU / Linux 2-е издание , вы можете найти то, что читаете с здесь . После того, как я напишу код, похожий на его, но он работает странно
$ ./shell
./shell>>quit
$ ./shell
./shell>>date
Sun Aug 8 21:19:37 CST 2010
./shell>>quit
$ ./shell
./shell>>abc
execlp failed: No such file or directory
./shell>>quit
./shell>>quit
$./shell
./shell>>abcd execlp
execlp failed: No such file or directory
./shell>>quit
./shell>>quit
Первый и второй случаи в порядке, но третий и четвертый несколько требуют двух quit , чтобы выйти. Это не то, что я ожидаю. Я думаю, что-то не так с fork () , или waitpid () , но это все еще не решено после того, как я спросил несколько людей вокруг меня. Сейчас летнее время, то есть летний отпуск, у меня больше нет друзей, на которых можно пойти. Спасибо всегда.
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define LINE_LEN 80
int main(int argc,char* argv[])
{
pid_t pid;
char cmd[LINE_LEN+1]={'\0'};
while(1)
{
printf("%s>>",argv[0]);
if(fgets(cmd,sizeof(cmd),stdin)==NULL)
{
perror("fgets failed");
break;
}
cmd[strlen(cmd)-1]='\0';
if(strncmp(cmd,"quit",4)==0)
{
break;
}
if((pid=fork())==-1)
{
perror("fork failed");
break;
}else if(pid==0)
{
//TODO no option can be specified for cmd
execlp(cmd,cmd,NULL);
perror("execlp failed");
}else
{
waitpid(pid,NULL,0);
}
}
return 0;
}