J'ai un programme shell personnalisé dans lequel j'ai inclus signal.h
, unistd.h
et stdio.h
. Je travaillais à l'origine sur RedHat Enterprise (je ne sais pas exactement quelle version, mais pas trop vieille) et j'ai pu utiliser gcc sur mon programme et il a bien compilé et s'est bien passé. Maintenant, je l'ai déplacé vers Ubuntu et gcc me donne quelques erreurs, dont la première est conflicting types for 'getline()'
. D'autres erreurs indiquent incompatible implicit declaration of built-in function strlen
. J'ai remplacé les fonctions en question, pourquoi cela fonctionnait-il dans RedHat mais pas dans Ubuntu? Linux n'est pas mon truc, alors s'il vous plaît, parlez clairement. Faites-moi savoir si vous avez besoin de plus de détails sur les erreurs.Erreurs avec gcc lors de la compilation du programme C
/* define a global input buffer */
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#define MAXARG 512
#define MAXBUF 512
#define BUFFER_SIZE 50
#define MAX_COMMANDS 10
char buffer [BUFFER_SIZE];
static char *prompt = "MYSHELL>";
static char inpbuf[MAXBUF];
static char *arg[MAXARG+1];
static char tokbuf[2*MAXBUF];
static char *tok = tokbuf;
char history[MAX_COMMANDS][MAXBUF];
int cmd_num;
void getline(void);
void getline() {
int length;
length = read(0, inpbuf, MAXBUF);
if (length == 0) {
printf("\n");
exit(0);
}
inpbuf[length] = '\0';
}
void processline() {
char *ptr = inpbuf;
int narg;
for (narg=0;;) {
arg[narg] = tok;
for (; *ptr == ' ' || *ptr == '\t'; ptr++)
;
while(*ptr != ' ' && *ptr != '\t' && *ptr != '\n' &&
*ptr != '\0' && *ptr != ';' && *ptr != '&')
*tok++ = *ptr++;
*tok++ = '\0';
if (narg < MAXARG)
narg++;
if (*ptr == '\n')
break;
}
// clear the input buffer
for (ptr = inpbuf; *ptr != '\n'; ptr++)
*ptr = ' ';
if (narg != 0) {
arg[narg] = NULL;
}
}
void handle_SIGINT()
{
write(STDOUT_FILENO, buffer, strlen(buffer));
}
int main()
{
int pid, exitstat, ret;
struct sigaction handler;
handler.sa_handler = handle_SIGINT;
handler.sa_flags = 0;
sigemptyset(&handler.sa_mask);
sigaction(SIGINT, &handler, NULL);
strcpy(buffer, "Caught Control C\n");
while (1) {
printf("%s ", prompt);
fflush(stdout);
getline();
processline();
if ((pid = fork()) < 0){
fprintf(stderr, "myshell: error\n");
return (-1);
}
if (pid == 0) {
execvp(*arg, arg);
fprintf(stderr, "%s\n", *arg);
exit(127);
}
waitpid(pid, &exitstat, 0);
}
return 0;
}
Il serait très utile pour vous d'essayer de réduire le programme à un exemple minimal qui démontre le problème. Continuez à supprimer tout votre code jusqu'à ce que vous ayez juste les inclusions et les déclarations (et peut-être un "bonjour, monde") qui démontre le problème. Cela peut vous aider à trouver le problème, mais si ce n'est pas le cas, vous pouvez éditer votre question et l'afficher ici, ce qui nous aidera à trouver votre problème. –
Le contenu du fichier d'en-tête peut varier d'un système à l'autre et de la compilation du compilateur à la compilation du compilateur et entre les bibliothèques. Vous pouvez trouver la sortie de 'gcc -E' très éclairante. Et ce que Brian Campbell a dit. – msw
Oui, évidemment ce que Brain a dit, mais j'essaie d'éviter de "supprimer" le code pour trouver le problème. Cela a fonctionné sur un autre système et même si je me rends compte que les compilateurs varient d'un système à l'autre, j'espérais que c'était quelque chose de simple que quelqu'un puisse répondre directement de la tête. – ubiquibacon