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