У меня есть следующий код:C Shell для выполнения команд
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
void passe(char *ligne, char **argv)
{
while (*ligne != '\0')
{
while (*ligne == ' ' || *ligne == '\t' || *ligne == '\n')
*ligne++ = '\0';
*argv++ = ligne;
while (*ligne != '\0' && *ligne != ' ' && *ligne != '\t' && *ligne != '\n')
ligne++;
}
*argv = '\0';
}
void executer(char **argv)
{
pid_t pid;
int status;
if ((pid=fork()) == 0)
{
if (execvp(*argv, argv) < 0)
{
printf("*** ERREUR: exec echoué\n");
exit(1);
}
}
wait(&status);
}
int main(void)
{
char ligne[1024];
char *argv[64];
while (1)
{
printf("Shell -> ");
scanf("%s",ligne);
printf("\n");
passe(ligne, argv);
if (strcmp(argv[0], "exit") == 0)
exit(0);
executer(argv);
}
return 0;
}
Программа прекрасно работает, однако, когда я анализирую что-то вроде «пс -f» она retunrs «execvp echoué», поскольку код удаляет пробелы , Что я должен сделать, чтобы заставить его принимать команды с такими параметрами, как ps -f?
Как именно использовать fgets? Я верю, что нужно разбирать файл? – Amine
Использование fgets() - очень плохая практика - она не обеспечивает проверку границ, поэтому она открыта для серьезных ошибок безопасности - и большинство компаний не разрешают использовать какой-либо код, чтобы использовать код для проверки кода по этой причине. –
@CharlesDuffy Я думаю, вы ошибаетесь. Поскольку scanf не имеет никакой проверки привязки. Вы можете использовать fgets как fgets (argv, 4, stdin). Второй аргумент проверяет границы. Теперь вы не можете ввести более 4 символов. –