मैं इस C प्रोग्राम को क्यों नहीं चला सकता?


12

मैं अपना पहला "प्रोसेस" प्रोग्राम चलाने की कोशिश कर रहा हूं, लेकिन मुझे निम्न त्रुटि मिलती है:

./fork.c: line 4: syntax error near unexpected token `('
./fork.c: line 4: `int main()'

मुझे पूरा यकीन है कि कोड सही है:

 #include <sys/types.h>
 #include <stdio.h>
 int main() {
     pid_t pid;
     printf("Hello fork()\n");
     switch(pid=fork())  {
         case -1: printf("Error by fork().....\n"); exit(0);
         case 0: printf("I'm the child process \n"); break;
         default: printf("I'm the dad \n"); break;
     }
  exit(0);
}

गलत क्या है?


15
बस अपने स्वयं के विवेक के लिए बाद में, "ब्रेक;" "केस -1:" लाइन पर। आप बाद में इसके लिए खुद को धन्यवाद देंगे। इसके अलावा, चाइल्ड प्रोसेस कॉल _exit (0), और पैरेंट कॉल एक्जिट (0) है।
ब्रूस एडगर

4
@BruceEdiger की आवश्यकता क्यों है _exit? पंजीकृत किए गए किसी भी सफाई को करने में क्या गलत है?
ऑरेंजडॉग

4
बाहर निकलें (0) stdout और stderr फ्लश करेगा। _exit (0) नहीं होगा। जब आपका प्रोग्राम कांटा () करता है, और बच्चा बाहर निकलने (0) को कॉल करता है, तो आप कुछ आउटपुट बाइटआउट पर डबल आउटपुट के साथ समाप्त कर सकते हैं। क्योंकि आप सीख रहे हैं कि कांटा () काम क्यों करता है?
ब्रूस एडिगर

@BruceEdiger सीखने में कैसे fork()काम करता है, यह सीखना शामिल है कि यह बफ़र्ड आउटपुट को कॉपी कर सकता है। एक यथोचित जटिल प्रणाली कॉल होने के नाते, सीखने की प्रक्रिया में कुछ भ्रम संभव है।
ऑरेंजडॉग

जवाबों:


67

आप बस नहीं चला सकते ./fork.c। यह एक कार्यक्रम नहीं है; यह एक कार्यक्रम के लिए स्रोत है । का उपयोग करते हुए ./यह मानता है कि फ़ाइल एक स्क्रिप्ट है (जो यह नहीं है) और तदनुसार व्यवहार करता है।

हालांकि, जैसा कि एक अन्य जवाब में कहा गया है, कंपाइलर (जैसे टिनी सी कंपाइलर ) हैं जो सी कोड को स्पष्ट रूप से संकलित किए बिना निष्पादित कर सकते हैं।

चूंकि यह एक सी कार्यक्रम है, इसलिए आपको कार्यक्रम को संकलित करना होगा। cc -o fork fork.cफिर कोशिश करो ./fork; यह यहाँ काम किया।


और अगर आपके लिनक्स पर, यह शायद जीसीसी है, सीसी नहीं।
लिनक्स 16

6
सबसे लिनक्स सिस्टम में @Linuxios, ccएक प्रतीकात्मक लिंक है gcc
रेनान

जानकार अच्छा लगा। हालांकि यह स्लेरिस जैसी प्रणालियों पर कुछ और इशारा करता है, है ना?
लिनक्स वायस

1
बस सोलारिस बक्से के एक जोड़े की जाँच की, और एक पर और दूसरे पर /usr/bin/ccलिंक । भले ही, यह अभी भी एक सी संकलक है। /opt/SUNWspro/bin/cc/opt/sunstudio12.1/bin/cc
ऑरेंजडॉग

1
और एक HPUX बॉक्स पर /opt/ansic/bin/cc
ऑरेंजडॉग

23

वह प्रोग्राम नहीं है, वह प्रोग्राम का सोर्स कोड है।

सी एक संकलित भाषा है, जिसका अर्थ है कि इसे चलाने से पहले मशीन-पठनीय निर्देशों में "संकलित" होना चाहिए। जैसा कि आप C का उपयोग कर रहे हैं, "C Compiler" ( cc) ऐसा कर सकता है।

cc -o fork for.c   # compile the code
chmod +x fork      # ensure it it executable
./fork             # run the compiled program

जब आप अधिक जटिल कार्यक्रमों की ओर बढ़ते हैं, तो कई स्रोत फ़ाइलों और बाहरी पुस्तकालयों का उपयोग करके, आप संभवतः "GNU कम्पाइलर कलेक्शन" ( gcc) का उपयोग करने के लिए आगे बढ़ेंगे और makeस्रोत कोड को एक कार्यशील निष्पादन योग्य बनाने के तरीके का वर्णन करेंगे।

इस प्रश्न में लिपियों के अंतर पर विभिन्न जानकारी है (जैसा कि आप अपने स्रोत कोड का इलाज करने का प्रयास कर रहे हैं) और संकलित कार्यक्रम।


यदि "संकलक" उपकरण के नाम का हिस्सा है, तो मैं उस कारण को स्पष्ट रूप से स्पष्ट करूंगा।
ऑरेंजडॉग

बस यह ध्यान दें कि मेरे द्वारा नामित उपकरण केवल उपलब्ध नहीं हैं, लेकिन जीएनयू / लिनक्स सिस्टम पर डिफ़ॉल्ट रूप से उपलब्ध होने की संभावना है और व्यापक रूप से उपयोग किया जाता है।
ऑरेंजडॉग

4
उस "शब्द" शब्द के बारे में, tcc( टिनी सी कंपाइलर ) सी कोड को स्पष्ट रूप से संकलित किए बिना निष्पादित कर सकता है। pastebin.com/5FZiMpEn (इसे पुनः जोड़कर टिप्पणी संपादित की गई। आदेश गड़बड़ करने के लिए क्षमा करें।)
manatwork
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.