ओएस: लिनक्स, भाषा: शुद्ध सीprintf विसंगति "कांटा()"
मैं एक विशेष मामले में यूनिक्स के तहत सी सामान्य रूप में प्रोग्रामिंग, और सी प्रोग्रामिंग सीखने में आगे बढ़ने कर रहा हूँ।
मुझे fork()
कॉल का उपयोग करने के बाद printf()
फ़ंक्शन के एक अजीब (मेरे लिए) व्यवहार का पता चला।
कोड
#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;
}
आउटपुट
Hello, my pid is 1111
I was forked! :DHello, my pid is 1111
2222 was forked!
क्यों दूसरा "हैलो" स्ट्रिंग बच्चे के उत्पादन में कब हुई?
हां, यह माता-पिता के pid
के साथ शुरू होने पर मूल रूप से मुद्रित होता है।
लेकिन!
#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;
}
आउटपुट:
Hello, my pid is 1111
I was forked! :D
2222 was forked!
यह क्यों होता है कि हम एक स्ट्रिंग के अंत में एक \n
चरित्र जगह अगर हम उम्मीद आउटपुट प्राप्त? क्या यह सही व्यवहार है, या यह एक बग है?
ठीक है, मुझे मिल गया। लेकिन मैं अभी भी खुद को समझा नहीं सकता कि बच्चे के आउटपुट में नई मुद्रित रेखा के अंत में "बफर कचरा" क्यों दिखाई देता है? लेकिन प्रतीक्षा करें, अब मुझे संदेह है कि यह वास्तव में बच्चे का आउटपुट है .. ओह, क्या आप समझा सकते हैं कि उत्पादन वास्तव में क्यों दिखता है (पुराने से पहले नई स्ट्रिंग), चरण-दर-चरण, इसलिए मैं बहुत आभारी रहूंगा। वैसे भी धन्यवाद! – pechenie
बहुत प्रभावशाली स्पष्टीकरण! बहुत बहुत धन्यवाद, अंततः मैं इसे स्पष्ट रूप से समझ गया! पीएस .: मैंने आपके लिए पहले वोट दिया था, और अब मैं बेवकूफ रूप से "ऊपर तीर" पर क्लिक करता हूं, इसलिए वोट गायब हो गया। लेकिन "जवाब बहुत पुराना है" के कारण मैं इसे आपको एक बार फिर नहीं दे सकता :( पीपीएस .: मैंने आपको अन्य प्रश्न में वोट दिया। और एक बार फिर धन्यवाद! – pechenie