如何在C中执行终端命令

时间:2014-08-24 17:43:30

标签: c linux

我试图模拟终端,在我的代码中几乎所有命令都执行得很好,但命令cd文件夹和cd ..当我尝试执行那些没有任何事情发生时,任何人都可以帮助我这个

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define MAXLEN 100
#define TRUE 1
#define FALSE 0

typedef struct command {
    char *cmd;              // string apenas com o comando
    struct command *next;   // apontador para o próximo comando
} COMMAND;

COMMAND *insert(COMMAND *list, char *cmd);
COMMAND *startList();
int strCompare(char *str1, char *str2);
int strLenght(char *str);

int main(void) {
    char command[MAXLEN] = "start";
    int id, return_command = 0;
    COMMAND *commands = startList();
    char exit_com[5] = "exit\0";
    int r;
    while(r = strCompare(command, exit_com)){
        char cwd[1024];

        if (getcwd(cwd, sizeof(cwd)) != NULL){
           fprintf(stdout, "%s: ", cwd);
        }

        fgets(command, MAXLEN, stdin);

        commands = insert(commands, command);

        id = fork();
        if (id == 0){
            return_command = system(command);

            if (return_command == -1){
                printf("\nErro ao executar o comando '%s'\n", command);
                exit(0);
            }

            COMMAND *c = commands;

            while(c != NULL){
                printf("%s\n", c->cmd);
                c = c->next;
            }
            exit(0);
        }
        wait(id);
    }
    return 0;
}

int strCompare(char *str1, char *str2){
    char aux = str2[0];
    int i = 0;
    while(aux != '\0'){
        if (str1[i] != str2[i])
            return 1;
        aux = str2[++i];
    }
    return 0;
}

COMMAND *startList(){
    return NULL;
}

COMMAND *insert(COMMAND *list, char *cmd){
    COMMAND *newCommand = (COMMAND*) malloc(sizeof(COMMAND));
    newCommand->cmd = cmd;
    newCommand->next = list;
    return newCommand;
}

2 个答案:

答案 0 :(得分:2)

您可能希望使用chdir调用来更改shell进程的工作目录。由system调用启动的子进程从父进程继承工作目录

答案 1 :(得分:1)

这是因为system函数启动了一个新进程,因此您运行system的每个命令都只会在该进程中运行。这就是shell通常在内部处理像cd这样的命令的原因。