Pergunta

Eu estou escrevendo um mini-shell para obter mais familiarizado com o gerenciamento de processos Unix em material de leitura do C. É a partir de linha de comando e passa estes argumentos via execlp ao sistema.

# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>

#define MAXSIZE 100

char prompt[MAXSIZE];

int main(void)
{
   pid_t pid;

   printf("> ");

   // read stuff 
   if (fgets(prompt, MAXSIZE, stdin) == NULL){
      printf("Input validation error!");
      abort();
   }
   // printf("DEBUG: %s" , prompt);

   if (strcmp(prompt, "exit")==0) abort();


   if ((pid=fork())<0){       // copy process

      printf("Process error!");
      abort();
   }

   if (pid==0){                // exec in son-prcess

      char *command=(char*)strtok(prompt, " ");
      execlp(command, command, 0);  // overwrite memory

      printf("Error, command not found!");
      abort();
   } else {

      waitpid(pid, 0, 0);
    }
}

Na verdade, este seria ele, mas eu não receber qualquer saída do execlp(). Alguém sabe por que isso acontece?

Foi útil?

Solução

Eu tentei executar o seu programa e ele falhou porque command continha uma \n (nova linha). Eu alterei-lo, colocando \n em vez de "" no strtok e, em seguida, foi executado com êxito.

Em detalhe:

  if (pid==0){                // exec in son-prcess
      char *command=(char*)strtok(prompt, "\n");
      printf ("'%s'\n", command);
      execlp (command, command, 0);  // overwrite memory
      printf("Error %d (%s)\n", errno, strerror (errno));
      abort();
   } else {

Test Run:

$ ./a.out 
> ls
'ls'
(usual ls behaviour)

Outras dicas

Kinopiko já encontrada por isso que não funciona, mas a razão que você não vê nenhuma mensagem de erro é que seu prompt shell é substituí-lo. Tente colocar uma nova linha no final:

printf("Error, command not found!\n");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top