Δημιουργια κελυφους

...ασύγχρονα μαθήματα γλώσσας C

Δημιουργια κελυφους

Δημοσίευσηαπό leo1925 » 18 Νοέμ 2012, 20:37

Καλησπερα σας.

Καινουριος στο forum και στο linux γενικα.
Λογω μιας εργασιας μου για το πανεπιστημιο πρεπει να φτιαξω ενα κελυφος για το ubuntu και εχω χτυπησει τοιχο ως το προς να του δωσω την ικανοτητα να υποστιρζει διεργασιες στο υποβαθρο (αυτο με το &).
Εχω βαλει το ubuntu 12.10 σε ενα virtual machine και τα τρεχω απο εκει.
Ο κωδικας που εχω γραψει μεχρι τωρα ειναι αυτος:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdlib.h>
#include <stdio.h>
#include <string.h> // Mainly for strtok
#include <unistd.h>
#include <errno.h>

#define MAX_ARGS 4

char * PATH = "MyShell$ ";

char *path; //for the command path

typedef struct{
char *cmd_path; //path of command
int argc; //number of args for the cmd
char *argv[MAX_ARGS];
//char cmd_suffix;
}commandStruct;

void runCommand(commandStruct *command1);

void cdr(int argc, char *argv[]);

int main() {

system("clear");

while(1) {
int flag = 0; //gia tin entoli cd
char buffer[100], *input;
pid_t child;
int childstatus, status; //For Fork

char *cmd; //For strtok

char *command; //The command
int cmdlen;

commandStruct *command1 = (commandStruct*) malloc(sizeof(commandStruct));
command1->argc = 1;

printf("%s", PATH);
fflush(stdout);
input=fgets(buffer, 100, stdin);


while(input[0]=='\n')
{
printf("%s", PATH);
fflush(stdout);
input = fgets(buffer, 256, stdin);
}



cmdlen = strlen(input); //Take out new line char
if (input[cmdlen-1] == '\n') { //
input[cmdlen-1] = '\0'; //
} //

//Get first token (the command) from input
cmd = strtok(input, " ");
command = cmd;


if (strcmp(command, "exit") == 0){
break;
}


command1->cmd_path = command;
command1->argv[0] = command1->cmd_path;

//Loop thru until whole command is tokenized
while (1)
{
//Check command has no more than 4 args
if (command1->argc > 4) {
printf("\nError! Too many command arguements!\n");
break;
}

//Extract next part of command
cmd = strtok(NULL, " ");

//Check that there is nothing else to extract
if (cmd == NULL)
{
//printf("Command Tokenised");
break;
}

command1->argv[command1->argc] = cmd; //put arg into arg array
command1->argc = command1->argc+1; //increase count of args

}

printf("Number of args: %d\n", command1->argc);

if(strcmp(command, "cd") == 0){
cdr(command1->argc, command1->argv);
flag=1;
}
if(flag==0){
childstatus = fork();
if (childstatus != 0) { //if parent process is running
wait(&status);
}
else {
/* This area is child process */
runCommand(command1);
return(0);
}
}

}
return 0;
exit(0);
}

void cdr(int argc, char *argv[]){

if(argc==1){
const char* home=getenv("HOME");
chdir(home);
return;
}
int result=chdir(argv[1]);
if (result!=0){
switch(result){
case EACCES: perror("Permission denied");
break;
case EIO: perror("An input output error occured");
break;
case ENAMETOOLONG: perror("Path is to long");
break;
case ENOTDIR: perror("A component of path not a directory");
break;
case ENOENT: perror("No such file or directory"); printf("enoent\n");
break;
default: printf("Couldn't change directory to %s\n", argv[1] );
}
}
}

void runCommand(commandStruct *command1) {

printf("Command: %s\n", command1->cmd_path);
int i=0;
i=execvp(command1->cmd_path, command1->argv);
if (i==-1){
printf("Λανθασμένη ή μη υποστηριζόμενη εντολή\n");
}

}

Ναι ξερω ο κωδικας μου θελει ξεκαθαριση και θελει και λιγο παραπανω σχεδιασμο.

Καμια ιδεα για το πως να συμπεριλαβω υποβαθρο; εχω διαβασει την wait() και την οικογενεια της στα man pages αλλα ακομα δεν μπορω να βρω πως να το κανω.

Η προθεσμια της εργασιας ειναι για Δευτερα 19/11 το βραδυ και για οποιον ειναι περιεργος η εκφωνηση της εργασιας ειναι αυτη.

Σας ευχαριστω εκ των προτερων.
Τελευταία επεξεργασία από the_eye και 18 Νοέμ 2012, 22:59, έχει επεξεργασθεί 1 φορά/ες συνολικά
Αιτία: Τον κώδικα τον βάζουμε μέσα σε [z_code]κώδικας[/z_code] για να εμφανιστεί με μορφοποίηση.
leo1925
babeTUX
babeTUX
 
Δημοσιεύσεις: 2
Εγγραφή: 18 Νοέμ 2012, 20:11
Εκτύπωση

Re: Δημιουργια κελυφους

Δημοσίευσηαπό simosx » 18 Νοέμ 2012, 21:13

leo1925 έγραψε:Καμια ιδεα για το πως να συμπεριλαβω υποβαθρο; εχω διαβασει την wait() και την οικογενεια της στα man pages αλλα ακομα δεν μπορω να βρω πως να το κανω.


Όπως αναφέρει η εκφώνηση στην αρχή, για να βάλεις κάτι στο παρασκήνιο (background), χρησιμοποιείς τη κλήση συστήματος fork().
Δες το βιβλίο σου για τη fork(), ή ψάξε εύκολα στο διαδίκτυο για κάποιο πολύ μικρό πρόγραμμα που επιδεικνύει το fork() (χρειάζεται και η wait()).
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Δημιουργια κελυφους

Δημοσίευσηαπό leo1925 » 18 Νοέμ 2012, 21:32

Εχω διαβασει και την fork() και την wait(), και οπως μπορεις να δεις τις χρησημοποιησα, το προβλημα μου ειναι οτι δεν μπορω να σκεφτω ποια θα ειναι η λογικη του προγραμματος οταν θα βαζει μια εργασια στο παρασκηνιο, οκ οταν δεν θελουμε να την βαλουμε στο παρασκηνιο η διεργασια γονεας περιμενει την διεργασια παιδι να τελειωσει και οταν αυτη στειλει μυνημα οτι τελειωσε (με την status()) τοτε η διεργασια γονεας συνεχιζει.
leo1925
babeTUX
babeTUX
 
Δημοσιεύσεις: 2
Εγγραφή: 18 Νοέμ 2012, 20:11
Εκτύπωση


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Μαθήματα C

cron