не получается воспользоваться execvp
http://forum.codenet.ru/forums/30, если не трудно.[/COLOR]
Здравствуйте.
Имею задачу, написать простенький интерпретатор shell'a, грубо говоря надо просто разобрать ввод и выполнить команду через execvp.
Сразу её синтаксис из мана:
с первым аргументом нету проблем, а вот со вторым.. Требуется тип char* const*, нужно, исходя из задачи, получить его динамически (со стандартного ввода), за лето потерял навык и смог разобрать ввод только через ограниченный массив char[256], затем попытался явно привести его к char* const* и передать в execvp, аллилуя, скомпилилось, но процесс не запускается. :mad:
Вот код:
Что я делаю не так? Как-то грустно, что я остановился, или даже застрял, на самой простой части реализации программы :facepalm:
[COLOR="red"]//add походу тему создал не там, перенесите сюда:
Здравствуйте.
Имею задачу, написать простенький интерпретатор shell'a, грубо говоря надо просто разобрать ввод и выполнить команду через execvp.
Сразу её синтаксис из мана:
Код:
int execvp(char * name, char *argv[]);
с первым аргументом нету проблем, а вот со вторым.. Требуется тип char* const*, нужно, исходя из задачи, получить его динамически (со стандартного ввода), за лето потерял навык и смог разобрать ввод только через ограниченный массив char[256], затем попытался явно привести его к char* const* и передать в execvp, аллилуя, скомпилилось, но процесс не запускается. :mad:
Вот код:
Код:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define spc (c != ' ' && c != '\t')
#define nspc (c == ' ' || c == '\t')
typedef enum {CMD, SPC, FLAG, SPF} state;
int main() {
int c, flc = 0, flsc = 0;
char fl[256][256];
state flag = CMD;
while ((c = getchar()) != EOF) {
if (c == '\n') {
if (fork() != 0) { //parent
wait(0);
}
else { //child
printf("Executing ps: %s\n", fl[0]);
for (int i = 0; i <= flc; i++) {
printf("FL%d: %s\n", i, fl);
}
execvp(fl[0], (char* const*)fl);
}
//clean:
for (int j = 0; j <= flc; j++) {
for (int k = 0; k < 256; k++) {
fl[j][k] = '\0';
}
}
flc = 0;
flsc = 0;
}
else if (flag == CMD && spc) {
fl[0][flsc++] = c;
}
else if (flag == CMD && nspc) {
flag = SPC;
}
else if ((flag == SPC || flag == SPF) && spc) {
flc++;
flsc = 0;
flag = FLAG;
fl[flc][flsc++] = c;
}
else if (flag == FLAG && spc) {
fl[flc][flsc++] = c;
}
else if (flag == FLAG && nspc) {
flag = SPF;
}
}
return 0;
}
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define spc (c != ' ' && c != '\t')
#define nspc (c == ' ' || c == '\t')
typedef enum {CMD, SPC, FLAG, SPF} state;
int main() {
int c, flc = 0, flsc = 0;
char fl[256][256];
state flag = CMD;
while ((c = getchar()) != EOF) {
if (c == '\n') {
if (fork() != 0) { //parent
wait(0);
}
else { //child
printf("Executing ps: %s\n", fl[0]);
for (int i = 0; i <= flc; i++) {
printf("FL%d: %s\n", i, fl);
}
execvp(fl[0], (char* const*)fl);
}
//clean:
for (int j = 0; j <= flc; j++) {
for (int k = 0; k < 256; k++) {
fl[j][k] = '\0';
}
}
flc = 0;
flsc = 0;
}
else if (flag == CMD && spc) {
fl[0][flsc++] = c;
}
else if (flag == CMD && nspc) {
flag = SPC;
}
else if ((flag == SPC || flag == SPF) && spc) {
flc++;
flsc = 0;
flag = FLAG;
fl[flc][flsc++] = c;
}
else if (flag == FLAG && spc) {
fl[flc][flsc++] = c;
}
else if (flag == FLAG && nspc) {
flag = SPF;
}
}
return 0;
}
Что я делаю не так? Как-то грустно, что я остановился, или даже застрял, на самой простой части реализации программы :facepalm: