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

    }

最佳答案

在“无效命令”代码中结束有两个原因。
你不是在比较字符串。command由于某种原因是指针数组,char **不是传递给strcmp()的第一个合法参数。
在命令字符串中包含换行符。这将导致所有strcmp()函数调用失败,即使修复了1。
程序中还有其他逻辑错误:
在这一行中:

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

你可能希望第二个||是一个==
stat_loc打印waitpid(2)返回值时,应使用手册页中列出的宏。在你的例子中,你似乎在寻找WEXITSTATUS(childValue)

08-27 19:57
查看更多