如何在popen

时间:2015-12-14 15:33:26

标签: c shell gcc popen fgets

所以,我必须构建一个自定义shell,它可以执行所有sh命令和位于/ usr / bin中的所有二进制文件以及包含在shell中的其他binairies文件,但我目前无法使用inbuild cd而且不知道如何使它工作即使通过chdir(我尝试了多次,但如果chdir在循环内,它将为每个shell重新创建一个fork)。

如果你能帮助我,因为我是一名学生并给我提示和建议,那就太棒了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "color.h"

int expertShell()
{       
    while(1)
    {
        FILE *fp;
        char path[1035], command[1024];
        printf(ANSI_COLOR_BLUE "☁  " ANSI_COLOR_RESET);
        fgets(command, sizeof(command)-1, stdin);

        if(strncmp(command, "cd", 2) == 0)
        {
            chdir(strtok(command, "cd "));
        }

        if(strncmp(command, "exit", 4) == 0)
        {
            exit(1);
        }

        if(strncmp(command, "ls", 2) == 0)
        {
            strcat(strtok(command,"\n"), " --color=always");
        }

        if(strncmp(command, "nano", 4) == 0 || strncmp(command, "vi", 2) == 0)
        {
            system(command);
        }
        else
        {
            fp = popen(command, "r");

            if (fp == NULL) {
                printf("Failed to run command\n" );
                exit(1);
            }

            while (fgets(path, sizeof(path)-1, fp) != NULL) {
                printf("%s", path);
            }

            pclose(fp);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

if(cdInBuild != 0)

您需要实际调用该函数。如上所述,这是检查cdInBuild是否为非空函数指针(始终为真)。

if(cdInBuild(command) != 0)