मैं pclose (3) का परीक्षण करना चाहता हूं कि क्या यह शेल कमांड समाप्त होने तक प्रतीक्षा करेगा। मैं दो छोटे शेल प्रोग्राम लिखता हूं।
//a.sh
#!/bin/bash
sleep 3
//b.sh
#!/bin/bash
echo "something"
sleep 3
सी कार्यक्रम:
//ptest.c
#include <stdio.h>
#include <sys/wait.h>
int main(int argc, char **argv) {
char *filename = argv[1];
char *mode = argv[2];
FILE *fl = popen(filename, &mode);
int t = pclose(fl);
if(WIFEXITED(t)) {
printf("exit status:%dn", WEXITSTATUS(t));
}
return 0;
}
फिर, संकलित करें: $ gcc -o ptest ptest.c
अगले पंस्ट को चलाएँ (मेरा कंप्यूटर उबंटू 12.04.3 LTS (है:
$ ./ptest "sh a.sh" r
$ exit status:0
यह परीक्षा होगी शेल समाप्त होने तक प्रतीक्षा करें और आउटपुट बाहर निकलने की स्थिति 0. जब भी मैं निम्न फॉर्म के रूप में ptest चलाता हूं:
$ ./ptest "sh b.sh" r
$ exit status:141
इस बार, ptest don "t Wait shell programme और खुद को तुरंत समाप्त कर दिया don मैं सिर्फ सोने से पहले एक इको स्टेटमेंट जोड़ता हूं, लेकिन परिणाम अलग था। मुझे नहीं पता" क्यों।
उत्तर:
उत्तर № 1 के लिए 1exit status:141
एक है SIGPIPE
त्रुटि। यह इस प्रश्न में अच्छी तरह से समझाया गया है क्यों grep -q के साथ बाहर निकलें कोड 141?
मुद्दा यह है कि आपके b.sh
स्क्रिप्ट पाइप को लिखने की कोशिश करती है, लेकिन कोई भी आपके सी कार्यक्रम में इस पाइप को नहीं पढ़ रहा है।