Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Имплементация на "Bash Shell" проблем

Featured Replies

Здравейте колеги, имам като задание да имплементирам "bash shell" ( език : С ), естествено, не в пълния си вид, а да може да изпълнява някои команди, като ( pwd, ls, echo, cat, rm, cd, etc. ). 
 

Седнах и направих план как да напиша програмата, и мисля че съм стигнал до някъде, баш шела работи, но странно защо, въведените команди веднъж се изпълняват веднъж не ( излиза съобщение : "command not found" ). 
Долу ще видите кода, моля за съвети как да процедирам. 

П.С. ще прикача снимка за да имате представа за какво говоря. 

 

 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <time.h>
#include <signal.h>
#include "functions.h"
#define SIZE 128

int main(int argc, char **argv)
{
    // call shell 
    shell_loop();

    return 0;
}

  

/**
 * gets user input 
 */
char *read_line(void)
{
    char *line = NULL;

    size_t len = 0;

    // save user's input in a character array 
    getline(&line, &len, stdin); 

    return line;
}

/**
 * splits user input into tokens 
 */
char **split(char *line)
{
    int pos = 0;
    char **tokens = malloc(SIZE * sizeof(char *));
    char *curr;

    curr = strtok(line, " "); 

    while (curr != NULL)
    {
        tokens[pos] = curr; // save current word into 'tokens'

        pos++; // update position 

        curr = strtok(NULL, " "); // get next word
    }

    return tokens;
}

/**
 * remove trailing '\n'
 */
void trim(char *s)
{
    int len = strlen(s); // get size of string

    // remove newline character
    if (s[len - 1] == '\n')
    {
        s[len - 1] = '\0';
    }
}

/**
 * gets local date and time in a specified format
 * and saves it into a character array 
 */
void *getLocalDateTime(char (*myTime)[SIZE])
{
    time_t t;

    struct tm *tmp;

    time(&t);

    tmp = localtime(&t); // get local date/time

    // saved it in passed char array 
    // by formatting it in a specific way 
    strftime(*myTime, sizeof(*myTime), "[%d/%m %H:%M]", tmp); 

    return 0;
}

  
  
  
  int execute(char **args){

    // if no command was entered 
    if(args[0] == NULL){
        return 1; 
    }

    // if "cd" is encountered
    else if(strcmp(args[0], "cd") == 0 ){
        return builtin_cd(args); 
    }

    // else use execvp()
    return launch_args(args); 
}
  
  
  
int launch_args(char **arguments)
{
    pid_t pid;
    int status;

  	// create a new process 
    pid = fork();

  	// if child = true 
    if (pid == 0)
    {	// execute command 
        if (execvp(arguments[0], arguments) == -1)
        {
            printf("shell: command not found: %s\n", arguments[0]);
        }
        exit(EXIT_FAILURE);
    }

    else if (pid < 0)
    {
        perror("forking failed");
    }
    //TODO:
    else
    {
        // parent process waits for child to complete
        wait(&status);
    }

    return 1;
}

int builtin_cd(char **args)
{

    if (args[1] == NULL)
    {
        // change directory to home directory 
        char *home = getenv("PATH");
        strcat(home, "/");
        chdir(home);
    }
    else
    {
        if (chdir(args[1]) != 0)
        {
            perror("shell: directory not found");
        }
    }

    return 1;
}



void shell_loop(void)
{
    char *line;
    char **arguments;
    int status;
    char myTime[SIZE];

    do
    {
        getLocalDateTime(&myTime); // get local date and time

        printf("%s # ", myTime); // print prompt

        line = read_line(); // get user input

        trim(line); // remove newline character

        arguments = split(line); // split input into tokens

        status = execute(arguments); // call appropriate function

        // cleanup
        free(line);
        free(arguments);
    } while (status);
}

                     
                     

 

Screen Shot 2019-03-14 at 8.50.14 PM.png

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.