PDA

Tam Sürümünü Görmek İçin : Linux de shell yazımı


blow_tr
01/06/2007, 20:02
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
int main(int argc , char** argv) {
int done=0;
int childpid;
char *s1 = (char *)malloc(sizeof(char) * 100);
const char *full_path = (char *)malloc(sizeof(char) * 100);
char *line = (char *)malloc(sizeof(char) * 100);
char *cmd = (char *)malloc(sizeof(char) * 100);
char *token = (char *)malloc(sizeof(char) * 100);
char *my_argv = (char *)malloc(sizeof(char) * 100);
char *space = '\0';
signal(SIGINT, SIG_IGN);
//typedef void (*sighandler_t)(int);

setenv("PROMPT","20040407>",0);

while (!done) {

char* prompt=getenv( "PROMPT" );

if (prompt) {

printf( "%s", prompt );
}
else {
/*
printf( "***Hata : ENV ler daha önce tanımlanmadı...\n" );
*/
printf( "\n# " );
}
strcpy(s1, "/bin/");

scanf("%s",line);
strtok_r(line," ",&my_argv);
strcpy(cmd, line);
strncat(cmd, "\0", 1);
// printf("%s",strcat(s1, line));
full_path = strcat(s1, cmd);
childpid = fork();
if (childpid == 0) { /* Child */
/* execute edilmek üzere argumanlar hazırlanıyor*/

execvp( full_path, &token);

}
else { // parent process
wait(NULL);

}

} /* while sonu */
}//main sonu



Arkadaşlar merhaba benim linuxde Shell yazmam gerekiyor ama argumanları alamıyorum mesela "ls -al" yazdıgım zaman çalışması lazım.geldiğim en son nokta bu
ve programın CTRL+D de exit yapması gerekiyor
Acil Yardım ederseniz sevinirim


zbahadir
01/06/2007, 21:51
Örnek bir kabuk inceleyerek yapabilirsin belki.
Kabuk(shell) o kadar kolay yazılabilen bir şey değil, en azından ben yapamıyorum.
bash, tsch, sh gibi kabukları incelemeni öneririm.

myavuzselim
01/06/2007, 22:13
execvp nasil calisir diye google'da aradim, cikan ikinci sonuc bir shell koduydu.
http://www.csl.mtu.edu/cs4411/www/NOTES/process/fork/exec.html

Bu arada execvp programi kendisi path'da (mesela /bin/) ariyormus, senin ugrasmana gerek yok.

blow_tr
02/06/2007, 01:31
Örnek bir kabuk inceleyerek yapabilirsin belki.
Kabuk(shell) o kadar kolay yazılabilen bir şey değil, en azından ben yapamıyorum.
bash, tsch, sh gibi kabukları incelemeni öneririm.

evet bunları incelemem lazım ama bunların kodları çok fazla nette var örnekler ama çalışmıyorlar bi türlü derledim o kadar ama malesef

blow_tr
02/06/2007, 01:34
execvp nasil calisir diye google'da aradim, cikan ikinci sonuc bir shell koduydu.
http://www.csl.mtu.edu/cs4411/www/NOTES/process/fork/exec.html

Bu arada execvp programi kendisi path'da (mesela /bin/) ariyormus, senin ugrasmana gerek yok.

arkadaşım çok saol bu netteki en yakın örnek benim için
Derledikten sonra inşallah çalışır halde olur...

çok teşekkür ederim saol valla tekrardan

PuzzLe
02/06/2007, 01:59
Ne yapmaya calistigini anlayabilmis degilim. Biraz daha acarsan belki yardimci olabilirim.

blow_tr
02/06/2007, 16:55
linux icin shell yazmaya çalışıyorum bi arkadaşın verdiği

#include <stdio.h>
#include <sys/types.h>

void parse(char *line, char **argv)
{
while (*line != '\0') { /* if not the end of line ....... */
while (*line == ' ' || *line == '\t' || *line == '\n')
*line++ = '\0'; /* replace white spaces with 0 */
*argv++ = line; /* save the argument position */
while (*line != '\0' && *line != ' ' &&
*line != '\t' && *line != '\n')
line++; /* skip the argument until ... */
}
*argv = '\0'; /* mark the end of argument list */
}

void execute(char **argv)
{
pid_t pid;
int status;

if ((pid = fork()) < 0) { /* fork a child process */
printf("*** ERROR: forking child process failed\n");
exit(1);
}
else if (pid == 0) { /* for the child process: */
if (execvp(*argv, argv) < 0) { /* execute the command */
printf("*** ERROR: exec failed\n");
exit(1);
}
}
else { /* for the parent: */
while (wait(&status) != pid) /* wait for completion */
;
}
}

void main(void)
{
char line[1024]; /* the input line */
char *argv[64]; /* the command line argument */

while (1) { /* repeat until done .... */
printf("Shell -> "); /* display a prompt */
gets(line); /* read in the command line */
printf("\n");
parse(line, argv); /* parse the line */
if (strcmp(argv[0], "exit") == 0) /* is it an "exit"? */
exit(0); /* exit if it is */
execute(argv); /* otherwise, execute the command */
}
}


örneği işimi görür ama buna history eklemem lazım
yardımcı olabilecek bi arkadaş varsa sevinirim

myavuzselim
02/06/2007, 17:27
readline kutuphanesini kullan.

blow_tr
02/06/2007, 20:13
readline kutuphanesini kullan.

anlayamadım daha açık anlatabilir misin?

myavuzselim
02/06/2007, 21:36
'readline' diye bir kutuphane var. Ona yaptirabilirsin. Nasil kullanildigini bilmiyorum (arastirman gerek), ama kendin yazmaktan daha kolay olacagi kesin (ozellikle de kullandigin dil C olunca :)).

blow_tr
02/06/2007, 22:15
'readline' diye bir kutuphane var. Ona yaptirabilirsin. Nasil kullanildigini bilmiyorum (arastirman gerek), ama kendin yazmaktan daha kolay olacagi kesin (ozellikle de kullandigin dil C olunca :)).
teşekkür ederim saolasın