在C. Fork()中制作自定义shell

时间:2013-09-24 20:39:25

标签: c linux shell input fork

所以,对于这个学校的项目,我试图让我的shell执行一个基本的fork()命令,但是,我给我的代码的输入似乎不起作用。

当我在命令行中输入fork()时,程序执行无效的输入部分。

我做错了什么?由于这是一个学校项目,我宁愿指出正确的方向,而不仅仅是有一个答案,如果那将是很酷的。 =)

#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM_ARGS 256
#define SIZE 256

void orders(char *command[SIZE]);

int main() {

    int pid = 0;
    int pid2 = 0;
    int childvalue =0;
    char buffer[SIZE]= "";
    //char input_args[MAX_NUM_ARGS];
    char **input_args = NULL;
    int i = 0;// counting variable
    printf("Welcome to my shell.\n");
    while(1){

    //initialize array of strings
    //first free any prevously allocated memory
    if (input_args != NULL)
    {   //memory has been allocated free it
        for (i = 0; i <MAX_NUM_ARGS; i++)
        {
            free(input_args[i]);
        }
    }   
    //free array of strings
    free(input_args);

    //new allocate memory
    input_args = (char**) malloc(sizeof(char*) * MAX_NUM_ARGS);
    //check return value for error
    if (input_args == NULL)
    {
        printf("We are out of memory. =(\n");
        continue;
        //print error: out of memory, exit with a error coce
    }
    //allocate memory for each string
    for (i = 0; i <MAX_NUM_ARGS; i++)
    { 
        input_args[i]= (char*)malloc(sizeof(char) * MAX_NUM_ARGS);
        if(input_args[i] == NULL)
            {//error

            printf("Error, the input is empty.");
            continue;
            }
    }


    printf("~$: "); //prompts the user for input
    fgets(buffer, sizeof(buffer), stdin);
    //if the user types in exit, quit
    if (strcmp(buffer, "exit\n") == 0){
        break;
    }
    //if user types in clear, wipe the screen and repeat the lop
    else if(strcmp(buffer, "clear\n")==0){

        system("clear");    
        continue;   

    }
    //should the user punch in nothing, repeat the loop
    else if (strcmp(buffer, "\n") == 0) {
        continue;
    }


    for (i = 0; i < SIZE; i++) {

        if(buffer[i] != '\n' || buffer[i] || ' ' || buffer[i] != '\t'){

        input_args[0][i] = buffer[i];

        }

    }

    //if the input doesn't fall under the conditionals above, execute orders.
    orders(input_args);


    } //end of while loop
     return 0;

    }//end of main function

    void orders(char *command[SIZE]){
    //handles the commands of the shell
        int pid =0;
    int pid2 = 0;
    int childValue = 0;
    if (strcmp(command, "fork()")== 0){


        pid = fork();//forks the process for the first time

        if (pid != 0){
            printf("I'm the parent, waiting on the child.\n");
            pid = waitpid(-1, &childValue,0);
            printf("Child %d returned a value of %x in hex.\n", pid,    childValue);
            return;//return backs to the main prompt
        }
        else{
            printf("I am the first child.\n");
            exit(2);//exits this process?
        }
    }
    //clears the screen
    else if(strcmp(command, "clear")==0){

        system("clear");        

        }

    else{//command outputted when you punch in a bad answer
        printf("Invalid command, %s.?\n", *command);
        }

    }   

1 个答案:

答案 0 :(得分:2)

有两个原因导致您在“无效命令”代码中结束。

  1. 您不是在比较字符串。由于某种原因,command是一个指针数组,char **不是传递给strcmp()的合法第一个参数。

  2. 您在命令字符串中包含换行符。这将导致您的所有strcmp()函数调用失败,即使您修复了#1。

  3. 您的程序中还有其他逻辑错误:

    1. 在这一行:

      if(buffer[i] != '\n' || buffer[i] || ' ' || buffer[i] != '\t'){
      

      您可能希望第二个||成为==

    2. stat_loc打印waitpid(2)返回值时,应使用手册页中列出的宏。在您的情况下,您似乎在寻找WEXITSTATUS(childValue)