दिलचस्प पोस्ट
जावा keystore में .cer प्रमाणपत्र कैसे आयात करें? MySQL: ऑर्डर ऑफ़ ऑर्डर आर रैंड () असफल मान्यकरण या अमान्य डुप्लिकेट के लिए खाली HTTP स्थिति कोड सी में बाउंड से बाहर सर्रे इंडेक्स PHP में एकल-उद्धृत और डबल-उद्धृत स्ट्रिंग्स में क्या अंतर है? ऐप बंद होने पर पुश नोटिफिकेशन ActionItem के लिए एनिमेटेड आइकन एंड्रॉइड में कस्टम डायलॉग बॉक्स कैसे बनाएं? जावा एफएक्स वेबव्यू पूरे क्षेत्र को भरने के लिए बढ़ता है सी ++ के लिए सबसे अच्छा खुले XML पार्सर क्या है? Uncaught TypeError: अपरिभाषित – 'jQuery उपकरण' की संपत्ति 'एमएसआई' पढ़ नहीं सकते गैर-विंडोज प्लेटफॉर्म (लिनक्स या मैक) पर पायथन में एक एक्सेस डेटाबेस पढ़ें Google Play Android डेवलपर API से सदस्यता जानकारी प्राप्त करने में असमर्थ समाशोधन UIWebview कैश एक पुनरावर्ती स्व-शामिल करने का सबसे आसान तरीका?

पाइपों के उपयोग से दो कार्यक्रमों के बीच एक साधारण स्ट्रिंग कैसे भेजनी है?

मैंने नेट पर खोज करने की कोशिश की, लेकिन शायद ही कोई संसाधन हैं एक छोटा सा उदाहरण पर्याप्त होगा।

संपादित करें मेरा मतलब है, एक दूसरे के साथ संवाद करने वाले दो अलग-अलग सी कार्यक्रम। एक कार्यक्रम "हाय" भेजना चाहिए और अन्य इसे प्राप्त करना चाहिए। ऐसा कुछ।

वेब के समाधान से एकत्रित समाधान "पाइपों के उपयोग से दो कार्यक्रमों के बीच एक साधारण स्ट्रिंग कैसे भेजनी है?"

एक नियमित पाइप केवल दो संबंधित प्रक्रियाओं को जोड़ सकता है यह एक प्रक्रिया के द्वारा बनाई गई है और जब अंतिम प्रक्रिया इसे बंद कर देगी गायब हो जाएगी।

एक नामित पाइप , जिसे इसके व्यवहार के लिए एक फीफा भी कहा जाता है, दो असंबंधित प्रक्रियाओं को जोड़ने और प्रक्रियाओं से स्वतंत्र रूप से मौजूद होने के लिए इस्तेमाल किया जा सकता है; जिसका अर्थ है कि यह तब भी अस्तित्व में है जब कोई भी इसका उपयोग नहीं कर रहा है। एक mkfifo() लाइब्रेरी फ़ंक्शन का उपयोग करके बनाया गया है।

उदाहरण

writer.c

 #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> int main() { int fd; char * myfifo = "/tmp/myfifo"; /* create the FIFO (named pipe) */ mkfifo(myfifo, 0666); /* write "Hi" to the FIFO */ fd = open(myfifo, O_WRONLY); write(fd, "Hi", sizeof("Hi")); close(fd); /* remove the FIFO */ unlink(myfifo); return 0; } 

reader.c

 #include <fcntl.h> #include <stdio.h> #include <sys/stat.h> #include <unistd.h> #define MAX_BUF 1024 int main() { int fd; char * myfifo = "/tmp/myfifo"; char buf[MAX_BUF]; /* open, read, and display the message from the FIFO */ fd = open(myfifo, O_RDONLY); read(fd, buf, MAX_BUF); printf("Received: %s\n", buf); close(fd); return 0; } 

नोट: त्रुटि जांच को सादगी के लिए ऊपर दिए गए कोड से छोड़ा गया था।

सी में पाइप्स बनाने से, यह आपको दिखाता है कि कैसे एक पाइप का उपयोग करने के लिए एक प्रोग्राम कांटा। यदि आप कांटा () नहीं करना चाहते हैं, तो आप नामित पाइप का उपयोग कर सकते हैं।

इसके अलावा, आप prog1 | prog2 का प्रभाव पा prog1 | prog2 prog1 | prog2 prog1 को stdout के आउटपुट और prog2 में stdin से पढ़ने के द्वारा। आप /dev/stdin नाम से फाइल खोलकर stdin पढ़ सकते हैं (लेकिन उस की पोर्टेबिलिटी के बारे में सुनिश्चित नहीं है)।

 /***************************************************************************** Excerpt from "Linux Programmer's Guide - Chapter 6" (C)opyright 1994-1995, Scott Burkett ***************************************************************************** MODULE: pipe.c *****************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> int main(void) { int fd[2], nbytes; pid_t childpid; char string[] = "Hello, world!\n"; char readbuffer[80]; pipe(fd); if((childpid = fork()) == -1) { perror("fork"); exit(1); } if(childpid == 0) { /* Child process closes up input side of pipe */ close(fd[0]); /* Send "string" through the output side of pipe */ write(fd[1], string, (strlen(string)+1)); exit(0); } else { /* Parent process closes up output side of pipe */ close(fd[1]); /* Read in a string from the pipe */ nbytes = read(fd[0], readbuffer, sizeof(readbuffer)); printf("Received string: %s", readbuffer); } return(0); } 
 dup2( STDIN_FILENO, newfd ) 

और पढ़ो:

 char reading[ 1025 ]; int fdin = 0, r_control; if( dup2( STDIN_FILENO, fdin ) < 0 ){ perror( "dup2( )" ); exit( errno ); } memset( reading, '\0', 1025 ); while( ( r_control = read( fdin, reading, 1024 ) ) > 0 ){ printf( "<%s>", reading ); memset( reading, '\0', 1025 ); } if( r_control < 0 ) perror( "read( )" ); close( fdin ); 

लेकिन, मुझे लगता है कि fcntl एक बेहतर समाधान हो सकता है

 echo "salut" | code 

Stdout पर लिखने वाला एक कार्यक्रम दूसरे द्वारा stdin के द्वारा पढ़ा जा सकता है। तो बस, सी का उपयोग करते हुए, printf() और prog2 का उपयोग कर कुछ को scanf() का उपयोग करने के लिए कुछ प्रिंट करने के लिए prog1 लिखें। तो बस चलाना

 ./prog1 | ./prog2 

यहाँ एक नमूना है :

 int main() { char buff[1024] = {0}; FILE* cvt; int status; /* Launch converter and open a pipe through which the parent will write to it */ cvt = popen("converter", "w"); if (!cvt) { printf("couldn't open a pipe; quitting\n"); exit(1) } printf("enter Fahrenheit degrees: " ); fgets(buff, sizeof (buff), stdin); /*read user's input */ /* Send expression to converter for evaluation */ fprintf(cvt, "%s\n", buff); fflush(cvt); /* Close pipe to converter and wait for it to exit */ status=pclose(cvt); /* Check the exit status of pclose() */ if (!WIFEXITED(status)) printf("error on closing the pipe\n"); return 0; } 

इस कार्यक्रम में महत्वपूर्ण कदम हैं:

  1. popen() कॉल जो माता-पिता में बाल प्रक्रिया और पाइप के बीच के संबंध को स्थापित करता है।
  2. fprintf() कॉल जो कि एक साधारण फ़ाइल के रूप में पाइप को बाल प्रक्रिया के स्टडिन में लिखने या इसके स्टडआउट से पढ़ा जाता है।
  3. pclose() कॉल जो पाइप को बंद करता है और बाल प्रक्रिया समाप्त करने का कारण बनता है।

सबसे पहले, प्रोग्राम 1 को स्टड आउट करने के लिए स्ट्रिंग लिखें (जैसे कि आप इसे स्क्रीन पर दिखाना चाहते हैं)। तो दूसरा प्रोग्राम stdin से एक स्ट्रिंग पढ़ना चाहिए, जैसे कि कोई उपयोगकर्ता कीबोर्ड से टाइप कर रहा था तो आप चलाते हैं:

प्रोग्राम_1 | program_2

यह उत्तर भविष्य के Googler के लिए सहायक हो सकता है

 #include <stdio.h> #include <unistd.h> int main(){ int p, f; int rw_setup[2]; char message[20]; p = pipe(rw_setup); if(p < 0){ printf("An error occured. Could not create the pipe."); _exit(1); } f = fork(); if(f > 0){ write(rw_setup[1], "Hi from Parent", 15); } else if(f == 0){ read(rw_setup[0],message,15); printf("%s %d\n", message, r_return); } else{ printf("Could not create the child process"); } return 0; } 

आप एक उन्नत दो-तरफ़ा पाइप कॉल उदाहरण यहां पा सकते हैं।