How to receive standard input from keyboad properly in a child process?












1















I'm running the following C program on Linux.



Program



// program.c
#include <stdio.h>
#include <unistd.h>

int main() {
if (fork() == 0) { // child process
int a, b;
scanf("%d %d", &a, &b);
printf("%d + %d = %dn", a, b, a + b);
}
return 0;
}


Expected behavior



$ ./program
1 2
1 + 2 = 3


Actual behavior



$ ./program
$ 1222245440 + 32764 = 1222278204


When I run the program in the terminal, the program will soon produce strange output like 1222245440 + 32764 = 1222278204 and doesn't wait for me to type. I think the problem is that the standard input and output streams of the child process are not attached to the terminal. Instead, the streams of parent process are attached. As a result, the child process cannot get my input from keyboard. Is there a method to solve this problem? I mean, to detach the streams of parent process and attach the streams of child process. For some reason, I must receive inputs in the child process.










share|improve this question













migrated from superuser.com Feb 26 at 12:45


This question came from our site for computer enthusiasts and power users.























    1















    I'm running the following C program on Linux.



    Program



    // program.c
    #include <stdio.h>
    #include <unistd.h>

    int main() {
    if (fork() == 0) { // child process
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d + %d = %dn", a, b, a + b);
    }
    return 0;
    }


    Expected behavior



    $ ./program
    1 2
    1 + 2 = 3


    Actual behavior



    $ ./program
    $ 1222245440 + 32764 = 1222278204


    When I run the program in the terminal, the program will soon produce strange output like 1222245440 + 32764 = 1222278204 and doesn't wait for me to type. I think the problem is that the standard input and output streams of the child process are not attached to the terminal. Instead, the streams of parent process are attached. As a result, the child process cannot get my input from keyboard. Is there a method to solve this problem? I mean, to detach the streams of parent process and attach the streams of child process. For some reason, I must receive inputs in the child process.










    share|improve this question













    migrated from superuser.com Feb 26 at 12:45


    This question came from our site for computer enthusiasts and power users.





















      1












      1








      1








      I'm running the following C program on Linux.



      Program



      // program.c
      #include <stdio.h>
      #include <unistd.h>

      int main() {
      if (fork() == 0) { // child process
      int a, b;
      scanf("%d %d", &a, &b);
      printf("%d + %d = %dn", a, b, a + b);
      }
      return 0;
      }


      Expected behavior



      $ ./program
      1 2
      1 + 2 = 3


      Actual behavior



      $ ./program
      $ 1222245440 + 32764 = 1222278204


      When I run the program in the terminal, the program will soon produce strange output like 1222245440 + 32764 = 1222278204 and doesn't wait for me to type. I think the problem is that the standard input and output streams of the child process are not attached to the terminal. Instead, the streams of parent process are attached. As a result, the child process cannot get my input from keyboard. Is there a method to solve this problem? I mean, to detach the streams of parent process and attach the streams of child process. For some reason, I must receive inputs in the child process.










      share|improve this question














      I'm running the following C program on Linux.



      Program



      // program.c
      #include <stdio.h>
      #include <unistd.h>

      int main() {
      if (fork() == 0) { // child process
      int a, b;
      scanf("%d %d", &a, &b);
      printf("%d + %d = %dn", a, b, a + b);
      }
      return 0;
      }


      Expected behavior



      $ ./program
      1 2
      1 + 2 = 3


      Actual behavior



      $ ./program
      $ 1222245440 + 32764 = 1222278204


      When I run the program in the terminal, the program will soon produce strange output like 1222245440 + 32764 = 1222278204 and doesn't wait for me to type. I think the problem is that the standard input and output streams of the child process are not attached to the terminal. Instead, the streams of parent process are attached. As a result, the child process cannot get my input from keyboard. Is there a method to solve this problem? I mean, to detach the streams of parent process and attach the streams of child process. For some reason, I must receive inputs in the child process.







      linux bash terminal c






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Feb 19 at 7:59









      Wang TianzeWang Tianze

      367




      367




      migrated from superuser.com Feb 26 at 12:45


      This question came from our site for computer enthusiasts and power users.









      migrated from superuser.com Feb 26 at 12:45


      This question came from our site for computer enthusiasts and power users.


























          1 Answer
          1






          active

          oldest

          votes


















          1















          I think the problem is that the standard input and output streams of the child process are not attached to the terminal. Instead, the streams of parent process are attached.




          The parent process doesn't wait for the child and returns immediately. The orphaned child cannot read from the terminal, the "strange output" is from garbage values of a and b. See what scanf returns, run this code:



          #include <stdio.h>
          #include <unistd.h>
          #include <sys/wait.h>

          int main() {
          int wstatus;
          if (fork() == 0) { // child process
          int a, b, n;
          n=scanf("%d %d", &a, &b);
          printf("(%d returned) %d + %d = %dn", n, a, b, a + b);
          }
          // wait(&wstatus);
          return 0;
          }


          You will most likely get something like (-1 returned) 1222245440 + 32764 = 1222278204. Then uncomment wait and try again.






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54885900%2fhow-to-receive-standard-input-from-keyboad-properly-in-a-child-process%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1















            I think the problem is that the standard input and output streams of the child process are not attached to the terminal. Instead, the streams of parent process are attached.




            The parent process doesn't wait for the child and returns immediately. The orphaned child cannot read from the terminal, the "strange output" is from garbage values of a and b. See what scanf returns, run this code:



            #include <stdio.h>
            #include <unistd.h>
            #include <sys/wait.h>

            int main() {
            int wstatus;
            if (fork() == 0) { // child process
            int a, b, n;
            n=scanf("%d %d", &a, &b);
            printf("(%d returned) %d + %d = %dn", n, a, b, a + b);
            }
            // wait(&wstatus);
            return 0;
            }


            You will most likely get something like (-1 returned) 1222245440 + 32764 = 1222278204. Then uncomment wait and try again.






            share|improve this answer




























              1















              I think the problem is that the standard input and output streams of the child process are not attached to the terminal. Instead, the streams of parent process are attached.




              The parent process doesn't wait for the child and returns immediately. The orphaned child cannot read from the terminal, the "strange output" is from garbage values of a and b. See what scanf returns, run this code:



              #include <stdio.h>
              #include <unistd.h>
              #include <sys/wait.h>

              int main() {
              int wstatus;
              if (fork() == 0) { // child process
              int a, b, n;
              n=scanf("%d %d", &a, &b);
              printf("(%d returned) %d + %d = %dn", n, a, b, a + b);
              }
              // wait(&wstatus);
              return 0;
              }


              You will most likely get something like (-1 returned) 1222245440 + 32764 = 1222278204. Then uncomment wait and try again.






              share|improve this answer


























                1












                1








                1








                I think the problem is that the standard input and output streams of the child process are not attached to the terminal. Instead, the streams of parent process are attached.




                The parent process doesn't wait for the child and returns immediately. The orphaned child cannot read from the terminal, the "strange output" is from garbage values of a and b. See what scanf returns, run this code:



                #include <stdio.h>
                #include <unistd.h>
                #include <sys/wait.h>

                int main() {
                int wstatus;
                if (fork() == 0) { // child process
                int a, b, n;
                n=scanf("%d %d", &a, &b);
                printf("(%d returned) %d + %d = %dn", n, a, b, a + b);
                }
                // wait(&wstatus);
                return 0;
                }


                You will most likely get something like (-1 returned) 1222245440 + 32764 = 1222278204. Then uncomment wait and try again.






                share|improve this answer














                I think the problem is that the standard input and output streams of the child process are not attached to the terminal. Instead, the streams of parent process are attached.




                The parent process doesn't wait for the child and returns immediately. The orphaned child cannot read from the terminal, the "strange output" is from garbage values of a and b. See what scanf returns, run this code:



                #include <stdio.h>
                #include <unistd.h>
                #include <sys/wait.h>

                int main() {
                int wstatus;
                if (fork() == 0) { // child process
                int a, b, n;
                n=scanf("%d %d", &a, &b);
                printf("(%d returned) %d + %d = %dn", n, a, b, a + b);
                }
                // wait(&wstatus);
                return 0;
                }


                You will most likely get something like (-1 returned) 1222245440 + 32764 = 1222278204. Then uncomment wait and try again.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Feb 19 at 9:31









                Kamil MaciorowskiKamil Maciorowski

                2006




                2006
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54885900%2fhow-to-receive-standard-input-from-keyboad-properly-in-a-child-process%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    How do I know what Microsoft account the skydrive app is syncing to?

                    When does type information flow backwards in C++?

                    Grease: Live!