Issue with CTRL+D on Windows Subsystem for Linux RRS feed

  • Question

  • Hello,

    I was working on an assignment using Windows Subsystem for Linux. Below is the C Code that was used to write a mini-shell for this assignment. 

    I ran into an interesting issue using WSL. On line 35, you can see that I call the read function to read in the buffer and it does a check for null. When pressing Control+D, while using WSL, it will go into the if statement and prints the print message on line 36 infinitely and does not stop until I used CTRL+C to exit. When running this program on a Linux machine, it behaves appropriately and prints once, and brings us to the top of the loop.

    Any ideas as to what this bug could be?


    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <error.h>
    char prompt[] = "$ ";
    static int
      pid_t pid;
      if ((pid = fork()) < 0)
        error(EXIT_FAILURE, errno, "fork error");
      long MAX = sysconf(_SC_LINE_MAX);
      char buf[MAX];
      pid_t pid;
      int status, n;
      do {
        write(STDOUT_FILENO, prompt, strlen(prompt));
        memset(buf, 0, MAX);
        if((n = read(STDIN_FILENO, buf, MAX)) == 0) {
          printf("use exit to exit shell\n");
        buf[strlen(buf) - 1] = '\0'; // chomp '\n'
        if (strncmp(buf, "exit", MAX) == 0) { // match
        pid = Fork();
        if (pid == 0) {  // child
          execlp(buf, buf, (char *)NULL);
          error(EXIT_FAILURE, errno, "exec failure");
        // parent
        if ((pid = waitpid(pid, &status, 0)) < 0)
          error(EXIT_FAILURE, errno, "waitpid error");
      } while(1);

    The program is in C but there are no options available to insert C Code snippets..

    Tuesday, July 23, 2019 7:12 PM

All replies