Announcement

Collapse
No announcement yet.

[Hỏi] Bài Hệ điều hành?

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [Hỏi] Bài Hệ điều hành?

    Cho em hỏi cái code này in ra bao nhiêu chữ ạ?
    • T ạo process:
    void main(){
    printf (“hi”);
    fork ();
    fork ();
    fork ();
    printf (“Hello”);
    fork ();
    printf (“Bye”);
    }

    thank các pro nhiều:beauty:
    Khi đã chọn công việc hay cái nghề cho mình thì nên đầu tư nhiều công sức cho nó thì sẽ thấy nó có nhiều cái hay để kiếm ra tiền lắm.Rồi cái quan trọng là có sức hay kiên trì mà làm không thôi! Đừng đứng núi này trông núi nọ thì phí hoài thời gian và tuổi trẻ thôi!

  • #2
    ai giúp em với:unhappy:
    Khi đã chọn công việc hay cái nghề cho mình thì nên đầu tư nhiều công sức cho nó thì sẽ thấy nó có nhiều cái hay để kiếm ra tiền lắm.Rồi cái quan trọng là có sức hay kiên trì mà làm không thôi! Đừng đứng núi này trông núi nọ thì phí hoài thời gian và tuổi trẻ thôi!

    Comment


    • #3
      Kết quả chạy nè em, anh chạy trên ubuntu + Qt

      Code:
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      Debug:
      + Vừa qua fork() thứ nhất, in ra
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      + Xong hàm fork() thứ hai, in ra thêm
      Code:
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      + Vừa qua fork() thứ 3, in ra thêm
      hi
      Hello
      Bye
      hi
      Hello
      Bye
      + Vừa qua fork() cuối cùng, in ra thêm
      hi
      Hello
      Bye
      + Sau cùng in ra:
      hi
      Hello
      Bye

      Comment


      • #4
        Hôm trước thầy nói rồi mà. Đầu tiên nó in chữ "HI" xong nó mở ra 2 qua hàm fork() tiếp đến 1 thằng thêm 2 nữa là 4 và qua hàm fork() thứ 3 là 8. Vậy sau nó in 8 chữ "Hello". Từ 8 tiến trình qua hàm fork() mỗi cái thêm 2 là 16 nó sẽ in chữ "Bye". Cộng lại là 1+8+16=25. Nhớ ko nhầm thì vậy )
        Ola:shock:la:choler:

        Comment


        • #5
          anh giải thích chương trình chạy như thế nào đi a, e không hiểu sao lại ra được kết quả như vậy?

          Comment


          • #6
            Anh chỉ tìm hiểu fork() trên mạng, cụ thể ở đây http://stackoverflow.com/questions/8...implementation

            Trong đó, hàm fork() sinh ra một process con từ tiến trình đang chạy. Hàm này trả về giá trị là PID của process con về cho chương trình đang chạy và trả về 0 cho process con.

            Ví dụ dưới đây cho đơn giản
            Code:
            #include <stdio.h>
            #include <unistd.h>     /* Symbolic Constants */
            #include <sys/types.h>  /* Primitive System Data Types */
            #include <errno.h>      /* Errors */
            #include <stdio.h>      /* Input/Output */
            #include <stdlib.h>     /* General Utilities */
            int n=1;
            
            int main( void )
            {
                n=fork();
                if(n==0)
                    printf("Process child, gia tri n=%d\n",n);
                else
                    printf("Process parent, gia tri n=%d\n",n);
                fork();
                printf("Hello\n");
            }
            + hàm fork() thứ nhất tạo ra một process con -> biến n của hàm con là 0, biến n của hàm cha là xxxx (giá trị này là PID của process con).
            process con này thực hiện đoạn code sau:
            Code:
             if(n==0)
                    printf("Process child, gia tri n=%d\n",n);
                else
                    printf("Process parent, gia tri n=%d\n",n);
                fork();
                printf("Hello\n");
            Sau bước n=fork(); thì tiến trình con sẽ được thực hiện. Vì trả về 0 cho process con nên n=0. Vì trong process con lại có hàm fork(), nên lại sinh ra một process con nữa, process này thực hiện đoạn code:
            Code:
             if(n==0)
                    printf("Process child, gia tri n=%d\n",n);
                else
                    printf("Process parent, gia tri n=%d\n",n);
                printf("Hello\n");
            Tất nhiên, biến n của process con này vẫn được trả về là 0 và ta có kết quả sau:
            Process child, gia tri n=0
            Hello
            Process child, gia tri n=0
            Hello
            + Process chính (process cha) lúc này được trả về là PID của process con do fork() thứ nhất. Đến hàm fork() thứ hai, được sinh ra ra từ process cha.
            Process con của fork() thứ 2 này thực hiện:
            Code:
                if(n==0)
                    printf("Process child, gia tri n=%d\n",n);
                else
                    printf("Process parent, gia tri n=%d\n",n);
                printf("Hello\n");
            Do trước đó, hàm cha được trả về n = PID. nên kết quả là:

            Process parent, gia tri n=2056
            Hello
            + Kết quả cuối cùng của process cha có được là :
            Process parent, gia tri n=2056
            Hello
            Kết quả, cuối cùng toàn bộ code được in ra:
            Process parent, gia tri n=2056
            Hello
            Process child, gia tri n=0
            Hello
            Process child, gia tri n=0
            Hello
            Process parent, gia tri n=2056
            Hello

            Lưu ý: nếu chạy không debug, thì process chính trả kết quả về trước.

            Nếu vận dụng những gì ở trên, có thể giải thích được kết quả của chủ topic này rồi.

            Comment


            • #7
              Các bạn lưu ý thêm giá trị trả về của hàm fork() chỉ có tác dụng từ hàm fork() trở xuống.

              Comment


              • #8
                Sax lộ đề ah`. Sáng thứ 3 Thi giữa kì thầy Trung có câu này @@

                Comment


                • #9
                  Originally posted by 07520256 View Post
                  Kết quả chạy nè em, anh chạy trên ubuntu + Qt

                  Code:
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  Debug:
                  + Vừa qua fork() thứ nhất, in ra


                  + Xong hàm fork() thứ hai, in ra thêm
                  Code:
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  hi
                  Hello
                  Bye
                  + Vừa qua fork() thứ 3, in ra thêm


                  + Vừa qua fork() cuối cùng, in ra thêm


                  + Sau cùng in ra:
                  Theo em nghĩ chỉ có một chữ "Hi" thui chứ a ! vì thực hiện in "Hi" ra rồi mới tới các fork(), các fork() sinh ra process con thì cũng chỉ ảnh hưởng đến các lệnh sau khi in "Hi" thôi a ! em có tìm hỉu thì thấy lý do mà in nhìu hi là vì các process con và cha mới dc tạo truy xuất cùng 1 bộ nhớ cho nên nó lấy thông tin từ bộ nhớ đệm của printf để xuất ra. nếu dọn đẹp bộ nhớ này thì không có nhiều chữ "Hi" như z, em dở lập trình cho nên chỉ đọc trên mạng, có gì anh kiểm tra lại giúp em lun

                  Comment


                  • #10
                    Originally posted by 11520444 View Post
                    Hôm trước thầy nói rồi mà. Đầu tiên nó in chữ "HI" xong nó mở ra 2 qua hàm fork() tiếp đến 1 thằng thêm 2 nữa là 4 và qua hàm fork() thứ 3 là 8. Vậy sau nó in 8 chữ "Hello". Từ 8 tiến trình qua hàm fork() mỗi cái thêm 2 là 16 nó sẽ in chữ "Bye". Cộng lại là 1+8+16=25. Nhớ ko nhầm thì vậy )
                    Em thấy cái này logic hơn nhìu chữ "Hi" á

                    Comment


                    • #11
                      Originally posted by 11520444 View Post
                      Hôm trước thầy nói rồi mà. Đầu tiên nó in chữ "HI" xong nó mở ra 2 qua hàm fork() tiếp đến 1 thằng thêm 2 nữa là 4 và qua hàm fork() thứ 3 là 8. Vậy sau nó in 8 chữ "Hello". Từ 8 tiến trình qua hàm fork() mỗi cái thêm 2 là 16 nó sẽ in chữ "Bye". Cộng lại là 1+8+16=25. Nhớ ko nhầm thì vậy )
                      vậy cái này đúng phải không ?
                      Thất bại là cơ hội để bạn bắt đầu lại một cách hoàn hảo hơn

                      Comment


                      • #12
                        Originally posted by 10520600 View Post
                        Sax lộ đề ah`. Sáng thứ 3 Thi giữa kì thầy Trung có câu này @@
                        like cùng tên
                        :sogood:
                        :hellboy::happy: ... Khánh Sevenup ... :happy::hellboy:

                        Comment


                        • #13
                          Originally posted by 12520256 View Post
                          vậy cái này đúng phải không ?
                          mình đi học thì thấy làm như bạn này chuẩn r...
                          :hellboy::happy: ... Khánh Sevenup ... :happy::hellboy:

                          Comment


                          • #14
                            thêm sau mỗi chuỗi \n kết quả như mong muốn, hoặc fflush(stdout) sau mỗi printf();
                            10520474
                            Lê Hoàng Lâm
                            Last edited by 10520474; 18-04-2014, 11:52.

                            Comment


                            • #15
                              theo những gì đã đọc thì cũng đúng như vậy

                              Comment

                              LHQC

                              Collapse
                              Working...
                              X