2013-07-03 60 views
6

Có 2 chương trình khác nhau, họ còn nhỏ ví dụ:fork() trong c sử dụng printf

int main() 
{ 
     printf ("print hello"); 
     fork(); 
} 

int main() 
{ 
     printf ("print hello\n"); 
     fork(); 
} 

đầu ra 1 là: `in helloprint chào

đầu ra 2 là : print hello

Câu hỏi đặt ra là, tại sao bản in chỉ có một lần \n chỉ in một lần và lần đầu tiên một nts nó hai lần?

Trả lời

8

Bạn đang chạy vào hành vi lưu vào bộ đệm của việc triển khai printf của hệ thống. Trong trường hợp đầu tiên, chuỗi được in vào bộ đệm, nhưng vì không có dòng mới (và bạn không gọi fflush), nó chỉ nằm trong bộ đệm đó. Sau đó, bạn ngã ba, và cả hai bộ đệm được chia đều khi các quy trình tương ứng của chúng thoát ra.

Trong trường hợp thứ hai, \n làm cho bộ đệm bị tuôn ra trước khi rẽ nhánh, vì vậy không có đầu ra nào còn lại khi quá trình rẽ nhánh thoát.

+4

cảm ơn! Hiểu ngay bây giờ. – DDukesterman

4

Thay đổi:

printf ("print hello"); 
    fork(); 

để

printf ("print hello"); 
    fflush(stdout); 
    fork(); 

Theo mặc định, stdout thường là dòng đệm. Trong ví dụ 2 của bạn), bạn có bảo đảm rằng stdout bị xóa trước fork nhưng trong ví dụ 1) nó có thể xảy ra sau fork. Flushing stdout trước khi fork đảm bảo bạn có chuỗi được in trước fork.

+2

điều này thực sự không trả lời "tại sao" – DRC