Здравствуйте. Есть рабочий код простого шелла
| Код | //---------------------------------------------------------------------------
#pragma hdrstop
#include <fcntl.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <stdio.h> #include <netinet/in.h> #include <resolv.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h>
void parseA(char* input); void parseB(char* input); void parseC(char* input); void parseD(char* input);
char* cmdparams[20][20][20] = {NULL}; int block = 0; int cmd = 0; int param = 0;
void parseA(char* input) { while (input[0] != 0) { cmd = 0; const char* delim = strchr(input, '|'); if (delim) { int len = delim-input; char* subcmd = (char*)malloc(len); strncpy(subcmd, input, len); subcmd[len] = '\0';
parseB(subcmd); block++; strcpy(input, delim+1); } else { parseB(input); return; } } }
void parseB(char* input) { while (input[0] != 0) { param = 0; char* delim = strchr(input, '&'); if (delim) { int len = delim-input; char* subcmd = (char*)malloc(len); strncpy(subcmd, input, len); subcmd[len] = '\0'; parseC(subcmd); cmd++; strcpy(input, delim+1); } else { parseC(input); return; } } }
void parseC(char* input) { while (input[0] == ' ') strcpy(input, input+1); while (input[strlen(input)-1] == ' ') input[strlen(input)-1] = '\0';
while (input[0] != 0) { char* delim = strchr(input, ' '); if (delim) { int len = delim-input; char* subcmd = (char*)malloc(len); strncpy(subcmd, input, len); subcmd[len] = '\0'; parseD(subcmd); param++; strcpy(input, delim+1); } else { parseD(input); return; } } }
void parseD(char* input) { cmdparams[block][cmd][param] = input; } //---------------------------------------------------------------------------
//---------------------------------------------------------------------------
int main(int argc, char* argv[]) { char input[] = "ls -l | cut -c 1-20 | cut -c 1-1 \0"; parseA(input); if (input[0] == 0) {perror("no params"); exit(1);}
int i = 0; int e = 0; int ids[20]; int pipes[20][2]; for (int i = 0; i < block; i++) pipe(pipes[i]);
while (cmdparams[i][e][0] != NULL) { while (cmdparams[i][e][0] != NULL) { if (cmdparams[i][e][0] != NULL) { if ((ids[i*e] = fork()) == -1) {perror("error creating child process"); exit(1);} if (ids[i*e] != 0) { if (cmdparams[i-1][e][0] != NULL) { dup2(pipes[i-1][0], 0); close(pipes[i-1][0]); close(pipes[i-1][1]); } if (cmdparams[i+1][e][0] != NULL) { close(pipes[i][0]); dup2(pipes[i][1], 1); close(pipes[i][1]); }
//printf("%s\n", cmdparams[i][e][0]); execvp(cmdparams[i][e][0], cmdparams[i][e]); perror("error executing child process"); exit(1); } else { if (cmdparams[i-1][e][0] != NULL) { close(pipes[i-1][0]); close(pipes[i-1][1]); } if (cmdparams[i+1][e][0] != NULL) { pipes[i-1][0] = pipes[i][0]; pipes[i-1][1] = pipes[i][0]; }
dup2(pipes[i*e][1], 0); } } e++; } i++; e = 0; }
printf("from parent\n"); getchar(); return 0; } //---------------------------------------------------------------------------
|
Он рабочий, только почем-то не всегда выводит то что нужно. Тоесть иногда (если попробовать запустить его несколько раз) он невыводит результата вообще. Вопрос - в чём-же тут может быть дело?
P.S. Извините что флудю с этими пайпами |