Попытка создать пользовательскую оболочку в c, которая выполняет (среди прочего) эту команду
Теперь это работало,но после изменений в getArgs () он либо бесконечно печатает сообщения об успешном завершении без создания файла, либо ненормально завершается.
Вот соответствующий код
else if(option == 3){
directory=" ";
if(A[0]=='.' || A[0]=='/'){
directory="./";
}
getArgs(&A,args,directory,&size);
for(i=0;i<size;i++){
printf("arg[%d] : %s\n",i,args[i]);
}
directory=concat(directory,args[0]);
printf("directory %s\n",directory );
fp = open(args[3],O_RDWR | O_CREAT|O_TRUNC,S_IRWXU);
pid=fork();
if(pid==0){
com = args[0];
dup2(fp,STDOUT_FILENO);
readCommand(args,directory,com,0);
return 1;
}
waitpid(-1,&status,0);
dup2(output,STDOUT_FILENO);
if(WIFEXITED(status)){
printf("Data successfully saved in file");
}else{
printf("Abnormal termination\n");
}
close(fp);
close(output);
clean(args);
}
Вот mylib.cфайл, включающий getArgs ()
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include "mylib.h"
#define MAX_SIZE 50
void getArgs(char **A,char *args[10], char *directory,int *sizeA){
int i,j,num,slash,size;
char *token,*s,*dummy;
trim(*A,&size);
*A=(char*)realloc(*A,(size) * sizeof(char*));
token = strtok (*A, " ");
num=0;
while (token != NULL)
{
args[num] = token;
token = strtok (NULL, " ");
num++;
}
s=args[0];
for(i=num;i<10;i++){
args[i]="\0";
}
if(*A[0]=='.' || *A[0]=='/'){
for(i=0;*args[i]!='\0';i++){
if(args[0][i]=='/'){
slash=i;
}
}
slash+=1;
j=0;
if(*A[0]=='.'){
memmove(args[0], (args[0])+slash, strlen(args[0]));
}
else if(*A[0]=='/'){
memmove(args[0], (args[0])+slash, strlen(args[0]));
}
}
*sizeA=num;
}
//resets args array
void clean(char *args[10]){
int i;
for(i=0;i<10;i++){
args[i] = '\0';
}
}
//reads and executes command
void readCommand(char *args[10],char *directory,char *com, int i){
if(execl(directory, args[i],args[i+1], NULL)==-1){
execl("/bin/sh", "/bin/sh", "-c", com, NULL);
perror("execlp");
}
else{
execl(directory, args[0],args[1],args[2],args[3],args[4], NULL); //max number of args=4
perror("execlp");
}
}
//concatenates 2 strings
char* concat(const char *s1, const char *s2)
{
const size_t len1 = strlen(s1);
const size_t len2 = strlen(s2);
char *result = malloc(len1 + len2 + 1);
memcpy(result, s1, len1);
memcpy(result + len1, s2, len2 + 1);
return result;
}
//trims the /n from the arguement
void trim(char *A,int *size){
int i=0;
do{
*size=i;
if(A[i]=='\n'){
A[i]='\0';
}
i++;
}while(A[i]!='\n');
}