में कांटा() मैं दो बच्चे प्रक्रियाओं बनाने के लिए की जरूरत है। एक बच्चा आदेश "ls -al" चलाने के लिए और अगले बच्चे प्रक्रिया के इनपुट, जो बारी में आदेश "प्रकार -r -k 5 -n" अपने इनपुट डेटा पर चलेगा करने के लिए इसके उत्पादन रीडायरेक्ट करने के लिए की जरूरत है। अंत में, मूल प्रक्रिया को पढ़ने की आवश्यकता है (डेटा पहले ही सॉर्ट किया गया है) और इसे टर्मिनल में प्रदर्शित करें। के रूप में अगर मैं खोल में सीधे निम्न आदेश में प्रवेश किया टर्मिनल में अंतिम परिणाम (जब कार्यक्रम को क्रियान्वित करने) एक ही होना चाहिए: "ls -al | तरह -r -k 5 -n"। इसके लिए मुझे निम्न विधियों का उपयोग करने की आवश्यकता है: पाइप(), कांटा(), execlp()।पाइप() और ग
मेरा प्रोग्राम संकलित करता है, लेकिन मुझे टर्मिनल पर वांछित आउटपुट नहीं मिलता है। मुझे नहीं पता कि क्या गलत है।
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
int fd[2];
pid_t ls_pid, sort_pid;
char buff[1000];
/* create the pipe */
if (pipe(fd) == -1) {
fprintf(stderr, "Pipe failed");
return 1;
}
/* create child 2 first */
sort_pid = fork();
if (sort_pid < 0) { // error creating Child 2 process
fprintf(stderr, "\nChild 2 Fork failed");
return 1;
}
else if(sort_pid > 0) { // parent process
wait(NULL); // wait for children termination
/* create child 1 */
ls_pid = fork();
if (ls_pid < 0) { // error creating Child 1 process
fprintf(stderr, "\nChild 1 Fork failed");
return 1;
}
else if (ls_pid == 0) { // child 1 process
close(1); // close stdout
dup2(fd[1], 1); // make stdout same as fd[1]
close(fd[0]); // we don't need this end of pipe
execlp("bin/ls", "ls", "-al", NULL);// executes ls command
}
wait(NULL);
read(fd[0], buff, 1000); // parent reads data
printf(buff); // parent prints data to terminal
}
else if (sort_pid == 0) { // child 2 process
close(0); // close stdin
dup2(fd[0], 0); // make stdin same as fd[0]
close(fd[1]); // we don't need this end of pipe
execlp("bin/sort", "sort", "-r", "-n", "-k", "5", NULL); // executes sort operation
}
return 0;
}
जब तक अगर आप से क्रियान्वित कर रहे हैं '/', "/ bin/ls" से "bin/ls" की जगह की कोशिश (के लिए इसी तरह की "/ bin/तरह") – wildplasser
ऐसा लगता है कि कोई त्रुटि जाँच कर रहे हैं। आपको कुछ जोड़ना चाहिए, जो आपको इस मुद्दे का निदान करने में मदद करेगा। –
मेरे पास बच्चों के ब्लॉक के अंदर printf() कथन हैं। "/" के बिना, यह मुझे बच्चों के बयान दोनों दिखाता है लेकिन जब मैं "/" डालता हूं तो यह उन बयानों को नहीं दिखाता है; ऐसा लगता है कि यह बच्चों के ब्लॉक तक नहीं पहुंचता है। – user2443819