1

所以,对于这个学校项目,我试图让我的 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);
        }

    }   
4

1 回答 1

2

您最终出现“无效命令”代码有两个原因。

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

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

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

  1. 在这一行:

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

    您可能希望第二个||==.

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

于 2013-09-24T20:44:37.257 回答