दिलचस्प पोस्ट
उपडोमेन के लिए डोमेन सेट कुकी Android में एक बटन का पृष्ठभूमि रंग प्राप्त करें गैर-सदस्य का उपयोग सी ++ 11 में शुरू और अंत का उपयोग क्यों करें? "Jta-datasource" और "संसाधन-स्थानीय" डेटा स्रोत के बीच का अंतर? उनमें से एक पर प्राथमिकता देने के दो मानों के आधार पर क्रमबद्ध करें "जीआईटी रीसेट" और "जीआईटी चेकआउट" के बीच अंतर क्या है? MySQL में पार्स तिथि दो वर्ण चर के बीच सामान्य सबस्ट्रिंग ढूंढें बाध्यकारी डाटाग्रीड को अवलोकन के लिए चयन <शब्दकोश> कोणीय 2 में एक साधारण JSONP अतुल्यकालिक अनुरोध कैसे करें? सूचीकरण पुनरावृत्ति के दौरान जावा.लिटी से किसी तत्व को निकालने के दौरान एक समवर्ती सुधार को प्राप्त करना। एंड्रॉइड में वाईफ़ाई कनेक्शन स्थापित किया गया है जब कैसे पता लगाने के लिए? स्काला कोड में विफलताओं को संसाधित करने के लिए या तो का उपयोग करना जावा में बाइट्स -128 से 127 की सीमा क्यों है? सफलता / त्रुटि / अंत में / अंगुल्यजेएस में वादे के साथ पकड़ने का उपयोग करना

सी में आप stdin / stdout / stderr को एक execvp () या समान कॉल करते समय फ़ाइलों में कैसे रीडायरेक्ट करते हैं?

मेरे पास निम्न कोड है:

pid_t pid = fork(); if (pid == -1) { // ... } else if (pid == 0) { stdin = someopenfile; stdout = someotherfile; stderr = somethirdopenfile; execvp(args[0], args); // handle error ... } else { // ... } 

समस्या यह है कि, execvp() कॉल के इनपुट / आउटपुट अभी भी फाइलों के बजाय कंसोल है स्पष्ट रूप से मैं कुछ गलत कर रहा हूं, ऐसा करने का सही तरीका क्या है?

Solutions Collecting From Web of "सी में आप stdin / stdout / stderr को एक execvp () या समान कॉल करते समय फ़ाइलों में कैसे रीडायरेक्ट करते हैं?"

ऐसा करने का सही तरीका है कि फाइल डिस्क्रिप्टर STDIN_FILENO , STDOUT_FILENO और STDERR_FILENO को dup2() का इस्तेमाल करते हुए खोले गए फाइलों के साथ dup2() । आपको बाल प्रक्रिया में मूल फ़ाइलों को भी बंद करना चाहिए:

 else if (pid == 0) { dup2(fileno(someopenfile), STDIN_FILENO); dup2(fileno(someotherfile), STDOUT_FILENO); dup2(fileno(somethirdopenfile), STDERR_FILENO); fclose(someopenfile); fclose(someotheropenfile); fclose(somethirdopenfile); execvp(args[0], args); // handle error ... } 

freopen फ़ंक्शन पर एक नज़र डालें

मुझे stdout समान कुछ करना था और मेरे लिए काम करने वाले दो कार्यों को लिखा था:

 static int fd; static fpos_t pos; void switchStdout(const char *newStream) { fflush(stdout); fgetpos(stdout, &pos); fd = dup(fileno(stdout)); freopen(newStream, "w", stdout); } void revertStdout() { fflush(stdout); dup2(fd, fileno(stdout)); close(fd); clearerr(stdout); fsetpos(stdout, &pos); } 

आप इसका उपयोग तब कर सकते हैं जब stdin, stdout, stderr टर्मिनल-

 //change stdin,stdout,stderr freopen("new_stdin","r",stdin); freopen("new_stdout","r",stdout); freopen("new_stderr","r",stderr); //----do something; //reset stdin,stdout,stderr freopen("/dev/tty","r",stdin); freopen("/dev/tty","r",stdout); freopen("/dev/tty","r",stderr);