Je lis GNU/Linux demande la programmation de la 2e édition, vous pouvez atteindre ce que je lis de here .Après J'écris le code similaire à la sienne, mais il fonctionne étrangement:simple shell en utilisant execlp va étrangement
$ ./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
les premier et deuxième cas sont ok, mais les troisième et quatrième les deux ont besoin un peu quit à quit.This est pas ce que je suis expecting.I deviner quelque chose ne va pas avec fork(), ou waitpid(), mais cela reste non résolu après demander à quelques personnes autour de moi.Maintenant, c'est l'heure d'été, c'est-à-dire les vacances d'été, je n'ai plus de compagnons à y aller.Merci toujours.
#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;
}
Thanks.I voir ce que vous voulez dire.Le code dans le livre ne fait aucune vérification d'erreur sur execlp, donc cette correction peut aller à l'errata? – schemacs
définitivement! Si votre livre ne le dit pas, rappelez-vous ceci: * vérifiez toujours les valeurs de retour * – mvds
(bien que, pour la classe de fonctions 'exec', le fait que votre code soit encore en vie est une indication d'échec, vérifiant ainsi une valeur de retour est strictement pas nécessaire de savoir que les choses se sont mal passées ...) – mvds