मुझे प्रोग्राम लिखना है जो pipe()
का उपयोग कर प्रक्रिया बनाते हैं।कांटा(), पाइप() और exec() प्रक्रिया निर्माण और संचार
मेरा पहला कार्य एक पेरेंट प्रक्रिया लिखना है जो fork()
फ़ंक्शन का उपयोग करके चार बाल प्रक्रियाएं उत्पन्न करता है।
एक बार fork()
सफल हो गया है, तो बच्चे की प्रक्रिया को अन्य प्रक्रिया rover1, rover2, rover3, and rover4
के साथ प्रतिस्थापित करें, हालांकि उनमें से सभी एक ही कोड हैं।
प्रक्रियाओं का कार्य निम्नानुसार है।
प्रत्येक बच्चे की प्रक्रिया शुरू में अपना स्वयं का नंबर दिया जाता है। यह माता-पिता से एक नया नंबर प्राप्त करता है। यह इस प्रकार के रूप में अपनी नई संख्या बनाता है और माता-पिता को फ़ॉरवर्ड पर निम्न सूत्र का उपयोग करना:
mynumber = (3 * mynumber + 4 * numberreceived)/7
यह प्रक्रिया जारी है माता-पिता संदेश यह है कि प्रणाली स्थिर है भेजता है जब तक। माता-पिता का प्रारंभिक संख्या भी है। यह सब बच्चों की संख्या प्राप्त करता है और इस प्रकार अपनी नई संख्या की गणना करता है:
mynumber = (3 * mynumber + numbers sent by all the children)/7
माता-पिता अपने सभी बच्चों के लिए इस नंबर भेज देंगे। यह प्रक्रिया जारी रहेगी जब तक कि माता-पिता को पता न लगे कि इसकी संख्या अब और नहीं बदली जा रही है। उस समय यह बच्चों को बताएगा कि सिस्टम स्थिर हो गया है।
मैंने यही किया लेकिन मेरे प्रोफेसर ने कहा कि मुझे बच्चे को निष्पादित करने और बच्चे की प्रक्रिया को किसी अन्य बच्चे की प्रक्रिया के साथ बदलने के लिए exec() का उपयोग करना होगा। मुझे यकीन नहीं है कि exec() का उपयोग कैसे करें। क्या आप कृपया इसके साथ मेरी मदद कर सकते हैं।
मैं केवल पहली बाल पीढ़ी को जोड़ रहा हूं।
// I included stdio.h, unistd.h stdlib.h and errno.h
int main(void)
{
// Values returned from the four fork() calls
pid_t rover1, rover2, rover3, rover4;
int parentnumber, mynumber1, mynumber2, mynumber3, mynumber4;
int childownnumber1 = 0, status = 1, childownnumber2 = 0,
childownnumber3 = 0, childownnumber4 = 0, numberreceived = 0;
printf("Enter parent number: ");
printf("%d", parentnumber);
printf("Enter each children number");
printf("%d %d %d %d", mynumber1, mynumber2, mynumber3, mynumber4);
// Create pipes for communication between child and parent
int p1[2], p2[2];
// Attempt to open pipe
if (pipe(p1) == -1) {
perror("pipe call error");
exit(1);
}
// Attempt to open pipe
if (pipe(p2) == -1) {
perror("pipe call error");
exit(1);
}
// Parent process generates 4 child processes
rover1 = fork();
// if fork() returns 0, we're in the child process;
// call exec() for each child to replace itself with another process
if (rover1 == 0) {
for(; numberreceived != 1;) {
close(p1[1]); // Close write end of pipe
close(p2[0]); // Close read end of second pipe
// Read parent's number from pipe
read(p1[0], &numberreceived, sizeof(int));
if (numberreceived == 1) {
// System stable, end child process
close(p1[0]);
close(p2[1]);
_exit(0); // End child process
}
mynumber1 = (int)((3*mynumber1 + 4*numberreceived)/7.0);
printf("\nrover1 number: ");
printf("%i", mynumber1);
// Write to pipe
write(p2[1], &mynumber1, sizeof(int));
}
}
/* Error:
* If fork() returns a negative number, an error happened;
* output error message
*/
if (rover1 < 0) {
fprintf(stderr,
"can't fork, child process 1 not created, error %d\n",
errno);
exit(EXIT_FAILURE);
}
}
क्या 'रोवरएक्स' निष्पादन योग्य के भीतर बाल प्रक्रियाओं को करने की कार्यक्षमता है? – user470379
@ user470379- हाँ मुझे लगता है। – cool