Hệ điều hành: Linux, Ngôn ngữ: tinh khiết Cprintf bất thường sau "fork()"
Tôi đang tiến lên trong việc học lập trình C nói chung và lập trình C trong UNIX trong trường hợp đặc biệt.
Tôi đã phát hiện thấy hành vi lạ (đối với tôi) của hàm printf()
sau khi sử dụng cuộc gọi fork()
.
Mã
#include <stdio.h>
#include <system.h>
int main()
{
int pid;
printf("Hello, my pid is %d", getpid());
pid = fork();
if(pid == 0)
{
printf("\nI was forked! :D");
sleep(3);
}
else
{
waitpid(pid, NULL, 0);
printf("\n%d was forked!", pid);
}
return 0;
}
Output
Hello, my pid is 1111
I was forked! :DHello, my pid is 1111
2222 was forked!
Tại sao thứ hai "Hello" chuỗi xảy ra ở đầu ra của trẻ?
Có, đó chính xác là những gì cha mẹ đã in khi bắt đầu, với bố mẹ pid
.
Nhưng! Nếu chúng ta đặt một nhân vật \n
vào cuối mỗi chuỗi chúng tôi nhận được đầu ra dự kiến:
#include <stdio.h>
#include <system.h>
int main()
{
int pid;
printf("Hello, my pid is %d\n", getpid()); // SIC!!
pid = fork();
if(pid == 0)
{
printf("I was forked! :D"); // removed the '\n', no matter
sleep(3);
}
else
{
waitpid(pid, NULL, 0);
printf("\n%d was forked!", pid);
}
return 0;
}
Output:
Hello, my pid is 1111
I was forked! :D
2222 was forked!
Tại sao nó xảy ra? Đó là hành vi đúng hay là một lỗi?
Ok, tôi hiểu rồi. Nhưng tôi vẫn không thể giải thích cho chính mình tại sao "rác đệm" xuất hiện ở cuối dòng mới được in ra trong đầu ra của đứa trẻ? Nhưng chờ đã, bây giờ tôi nghi ngờ rằng nó thực sự là đầu ra của CHILD .. oh, bạn có thể giải thích tại sao đầu ra trông CHÍNH XÁC (chuỗi mới TRƯỚC cái cũ) như thế, từng bước, vì vậy tôi sẽ rất biết ơn. Cảm ơn bạn! – pechenie
Giải thích rất ấn tượng! Cảm ơn bạn rất nhiều, cuối cùng tôi đã hiểu rõ! P .: Tôi đã bỏ phiếu cho bạn trước đây và giờ tôi đã nhấp vào "mũi tên lên" một cách ngu ngốc một lần nữa, vì vậy bỏ phiếu đã biến mất. Nhưng tôi không thể đưa lại cho bạn một lần nữa vì "câu trả lời quá cũ": ( P.P.S .: Tôi đã bỏ phiếu cho bạn trong câu hỏi khác. Và cảm ơn bạn một lần nữa! – pechenie