Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: stdin ,stdout , stderr , stdpn , bộ nhớ đệm là gì ....

  1. #1
    Ngày gia nhập
    04 2011
    Bài viết
    21

    Mặc định stdin ,stdout , stderr , stdpn , bộ nhớ đệm là gì ....

    các bạn cho mình hỏi chút ...

    stdin ,stdout , stderr , stdpn , bộ nhớ đệm là gì ?
    theo giải thích thì nó thế này ...
    [IMG][/IMG]
    nhưng mình vẫn chưa hiểu cách thức hoạt động của nó thế nào ....
    có thể giải thích giúp mình cách hoạt động của chúng được không ?
    (Nếu có tài liệu thì hay qua...) .
    thanks !!!!

    stdin ,stdout , stderr , stdpn , bộ nhớ đệm
    Đã được chỉnh sửa lần cuối bởi langman : 22-04-2012 lúc 01:11 PM. Lý do: Cắt bớt xuống dòng

  2. #2
    Ngày gia nhập
    11 2010
    Bài viết
    589

    • Khi thao tác với file trong C thì mỗi file được gắn với một đối tượng kiểu FILE*, ví dụ:
      C Code:
      1. FILE* f = fopen("abc.txt","r");
      sau đó, để thao tác đọc, ghi với file người ta có thể dùng các hàm fprintf, fscanf, fread, fwrite, fgets, ...

      Để cho đơn giản, người ta định nghĩa một số file đặc biệt, và một số hàm đặc biệt dành cho nó để khi thao tác không cần thiết phải chỉ ra tên file:
      Code:
      stdin : thiết bị nhập chuẩn
      stdout : thiết bị xuất chuẩn
      stderr : thiết bị xuất lỗi chuẩn
      stdprn : thiết bị in chuẩn
      như vậy:
      C Code:
      1. printf("abc", ...);
      2. /* thực chất là : */
      3. fprintf(stdout, "abc", ...);

      Còn stdin, stdout, stderr ... thực chất gắn với file nào thì đó là việc của hệ điều hành và thư viện, và người dùng cũng có thể định nghĩa nó.
      • Với những hệ điều hành tương thích POSIX thì stdin, stdout, stderr được gắn với các thiết bị cuối (terminal), terminal đây có thể là console ảo (khi làm việc ở chế độ cli) hoặc pseudo terminal (khi làm việc ở chế độ đồ hoạ với các terminal emulator). Thao tác đọc ghi vào các file đặc biết trên cũng chính là đọc ghi vào các terminal kia.
        Ví dụ, ở môi trường đồ họa trên Linux, khi dùng 1 terminal emulator (như gnome-terminal hay urxvt) ta có:
        Code:
        boss14420 ~ $ tty    # lệnh này hiện tên file đang gắn với terminal này
        /dev/pts/12
        boss14420 ~ $ echo "fgjhdksgk" > /dev/pts/12  # ghi đoạn "fgjhdksgk" vào file /dev/pts/12 tương ứng với việc ghi vào stdin của terminal
        fgjhdksgk
        boss14420 ~ $ echo "fgjhdksgk" > /dev/pts/13 # ghi vào một pseudo terminal khác, không hiện ra gì hết
        boss14420 ~ $
      • Người dùng cũng có thể định nghĩa stdin, stdout, stderr tùy ý, gọi là chuyển hướng xuất nhập:
        Ví dụ, đoạn code C sau nhập vào một số và in ra bình phương của nó:
        C Code:
        1. // file sample.c
        2. #include <stdio.h>
        3. int main() {
        4.     int a;
        5.     scanf("%d",&a);
        6.     printf("%d\n",a*a);
        7. }
        • gọi chương trình một cách bình thường:
          Code:
          boss14420 ~ $ ./sample
          2
          4
          boss14420 ~ $
          lúc này stdin và stdout đều gắn với một terminal nào đó như đã nói ở trên
        • chuyển hướng:
          Code:
          boss14420 ~ $ echo 2 > input.in # ghi số 2 vào file input.in
          boss14420 ~ $ ./sample <input.in >output.out
          boss14420 ~ $
          boss14420 ~ $ cat output.out
          4
          boss14420 ~ $
          Không có gì hiện ra cả, vì ở đây stdin chính là file input.in, stdout là file output.out, tức là chương trình sẽ đọc dữ liệu từ file input.in (thay vì người dùng nhập vào) và xuất kết quả ra file output.out (thay vì xuất ra màn hình như bình thường).

    • Bộ nhớ đệm: Do tốc độ của việc đọc/ghi từ file là thấp trong khi tốc độ xử lý của CPU là cao nên nếu cứ một lần yêu cầu đọc/ghi mà lại thực hiện ngay thì CPU sẽ phải chờ cho đến ghi thao tác đó xong mới xử lý tiếp, dẫn đến làm chậm tốc độ của cả chương trình.
      Giải pháp: thay vì yêu cầu đến đâu đọc đến đó, người ta đọc một lần nhiều ký tự vào một vùng nhớ và khi nào có yêu cầu đọc thì lấy dữ liệu ở vùng nhớ đó, đến khi nào hết thi lại đọc tiếp. Với thao tác ghi thì người ta ghi vào một vùng nhớ, đến khi vùng nhớ đó đầy thì mới ghi một lượt tất cả những thứ trong vùng nhớ đó. Những vùng nhớ này chính là bộ nhớ đệm.

  3. #3
    Ngày gia nhập
    04 2011
    Bài viết
    21

    oh...ra là vậy ...

    cảm ơn bạn nhé !

  4. #4
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Trích dẫn Nguyên bản được gửi bởi thang7788 Xem bài viết
    oh...ra là vậy ...

    cảm ơn bạn nhé !
    Cá 20k là bác đọc mà không hiểu gì. :-|
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

Các đề tài tương tự

  1. Hàm fflush(stdin) | công dụng của fflush(stdin) như thế nào?
    Gửi bởi sangu trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 20-05-2016, 10:06 PM
  2. Cách dùng lệnh fflush(stdin)? Lệnh fflush(stdin) có tác dụng gì?
    Gửi bởi dehin trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 12
    Bài viết cuối: 05-11-2015, 02:23 AM
  3. Lập trình C Sự khác nhau giữa printf() và fprintf(stdout,"")?
    Gửi bởi KaitoKid trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 9
    Bài viết cuối: 30-12-2013, 01:31 PM
  4. DÒng vào stdin
    Gửi bởi boydamtac199 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 29-11-2013, 12:49 AM
  5. Lập trình C Chuyển hướng stdin, stdout ra Socket
    Gửi bởi kenshin trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 28-12-2010, 02:58 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn