0

こんにちは、シェルの基本的な実装を作成する割り当てがあり、割り当ての一部で、プロンプトと共に日付/時刻を出力するよう求められます。

日付と時刻は、dd/mm HH/MM の形式である必要があります。

それを表示することはできますが、lsのようなコマンドを実行すると機能しませんが、日時印刷機能を削除するとコマンドが機能するため、インターネット上で役立つものが見つからないようです。ここに投稿しようと思った

これが私のコードです:

comp20200Shell.c

#include "comp20200Shell_header.h"
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

int main(void)
{
    bool end_program = false;
    size_t length = 0;
    ssize_t read;
    char* input = NULL;

    while(end_program != true)
    {
        if(signal(SIGINT, sigintHandler) == SIG_ERR)
        {
            fprintf(stderr, "An error occured while setting a signal handler\n");
            exit(EXIT_FAILURE);
        }

        printf("\x5b");
        return_time();
        printf("\x5d %s", PROMPT);

        read = getline(&input, &length, stdin);

        remove_trailing_newline(input);

        if(strcmp(input, "exit") == 0 || read == EOF)
        {
            if(read == EOF)
            {
                putchar('\n');
            }
            return(0);
        }

        if(process_input(&input) == -1)
        {
            fprintf(stderr, "Command not found\n");
        }
    }

    return(0);
}   

void sigintHandler(int sig_num)
{
    if(signal(SIGINT, sigintHandler) == SIG_ERR)
    {
        fprintf(stderr, "An error occured while setting a signal handler\n");
        exit(EXIT_FAILURE);
    }
    fflush(stdout);
    return;
}

comp20200Shell_header.h

#include <ctype.h>
#include <string.h>

#define PROMPT "# "

void remove_trailing_newline(char *input);
void sigintHandler(int sig_num);
int process_input(char** input);
void return_time(void);

process_input.c

#include "comp20200Shell_header.h"
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

int process_input(char** input)
{
    pid_t child_pid;
    int child_status;
    char** argument = malloc(sizeof(char*));
    int count = 0;
    char* temp = strtok(*input, " ");
    while(temp != NULL)
    {
        argument[count] = temp;
        count ++;
        argument = realloc(argument, (count+1) * sizeof(char *));
        temp = strtok(NULL, " ");
    }

    child_pid = fork();
    if(child_pid == 0)
    {
        execvp(argument[0], argument);
        return(-1);
    }
    else
    {
        wait(&child_status);;
    }

    return(0);
}

remove_trailing_newline.c

#include "comp20200Shell_header.h"
#include <stdio.h>

void remove_trailing_newline(char* input)
{
    int index;
    for(index = 0; input[index] != '\0'; index++)
    {
        if(input[index] == '\n')
        {
            input[index] = '\0';
        }
    }

    return;
}

time_now.c

#include "comp20200Shell_header.h"
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

void return_time(void)
{
    time_t now;
    struct tm *timestamp;
    char time_now[12];

    now = time(NULL);

    timestamp = localtime(&now);
    strftime(time_now, sizeof(time_now), "%d/%m %H:%M", timestamp);
    printf("%s", time_now);

    return;
}

これは、コマンドを実行すると得られるものです。

[26/03 18:04] # ls
ls: cannot access p��: No such file or directory
[26/03 18:04] # 
4

0 に答える 0