繁体   English   中英

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

[英]Making custom shell in C. 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. 您没有在比较字符串。 由于某种原因, command是一个指针数组,而char **不是传递给strcmp()的合法第一个参数。

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

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

  1. 在这一行:

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

    您可能需要第二个|| 成为==

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM