У меня есть программа C, которая должна закрываться, когда я предлагаю в качестве ввода «выйти» - PullRequest
0 голосов
/ 08 июля 2020

У меня есть программа C, в которой я могу предлагать в качестве ввода различные команды. Команды обрабатываются дочерними элементами, а ответы отправляются обратно родителю. Одна из моих команд - выйти, а одна - войти. Если у меня есть команды ввода в следующем порядке: вход и выход, выход должен быть введен дважды, чтобы закрыть программу. Также родитель принимает ввод через некоторое время l oop, а quit должен закрыть программу. Также я получаю результат первого входа в систему в качестве ответа.

Если вы знаете, что может быть, дайте мне знать. Спасибо! Удачного дня!

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>

#define verde printf("\033[0;32m")
#define alb printf("\033[0m")
#define rosu printf("\033[0;31m")
#define blue printf("\033[1;34m")

typedef int bool;
#define true 1
#define false 0

int main(int argc, char **argv)
{
    char *comanda = (char *)malloc(55);
    bool loggedIn = false;

    while (1)
    {
        blue;
        printf("Insert the command: ");
        alb;
        fgets(comanda, 55, stdin); 
        
        if(strstr(comanda, "quit") != NULL)
        {
            exit(0);
        }

        if (strstr(comanda, "login : ") != NULL )
        {   
            pid_t pid;
            int fd[2];

            if (pipe(fd) == -1)
            {
                rosu;
                perror("Am esuat in a crea un pipe...");
                exit(1);
            }

            if ((pid = fork()) == -1)
            {
                rosu;
                perror("Child failed...");
                exit(2);
            }
            else if (pid)
            { 

                FILE *ptr;

                close(fd[0]);
                if ((ptr = fopen("users.txt", "r")) == NULL)
                {
                    rosu;
                    perror("Failed to open users.txt ...");
                    exit(3);
                }

                char username[30];
                bool gasit = false;


                while (fgets(username, 30, ptr))
                {
                    if (strstr(comanda, username) != NULL)
                    {
                        gasit = true;
                        break;
                    }
                }
                if (write(fd[1], &gasit, sizeof(bool)) == -1)
                {
                    rosu;
                    perror("Failed to write in pipe...");
                    exit(4);
                }
                close(fd[1]);
            }


            wait(NULL);

            bool raspuns;

            close(fd[1]); 

            if (read(fd[0], &raspuns, sizeof(bool)) == -1)
            {
                rosu;
                perror("Can't write from pipe...");
                exit(5);
            }

            if (raspuns == true)
            {
                verde;
                printf("Succes!\n");
                alb;
            }
            else
            {

                rosu;
                printf("Failed to login!\n");
                alb;
            }

            close(fd[0]);
        }
        else if(strstr(comanda, "myfind : ") != NULL)
        {  
        }
        else if(strstr(comanda,"mystat : ")!=NULL)
        {  
        }
        else
        {   
            rosu;
            printf("Wrong command!\n");
            alb;
        }
        
    }

    return 0;
}
...