के लिए असाइन किए गए टर्मिनल डिवाइस का पता लगाने के लिए मैं पेजर pspg
लिख रहा हूं। वहां मुझे निम्नलिखित मुद्दे को हल करना है। stdin
से पढ़ने के बाद मुझे टर्मिनल से पढ़ने के लिए पाइप से पिछले पढ़ने से stdin
पुन: असाइन करना चाहिए। ऐसा कोई:इंटरैक्टिव काम
मैं
freopen("/dev/tty", "r", stdin)
इस्तेमाल किया लेकिन यह काम नहीं करता है, जब पेजर आदेश से इस्तेमाल किया गया था कि क्या इस मामले में सीधे
su - someuser -c 'export PAGER=pspg psql somedb'
निष्पादित नहीं किया गया था, मैं एक त्रुटि मिली डिवाइस या पता।
मैं एक समाधान पाया - अब, कोड की तरह दिखता है:
if (freopen("/dev/tty", "r", stdin) == NULL)
{
/*
* try to reopen pty.
* Workaround from:
* https://cboard.cprogramming.com/c-programming/172533-how-read-pipe-while-keeping-interactive-keyboard-c.html
*/
if (freopen(ttyname(fileno(stdout)), "r", stdin) == NULL)
{
fprintf(stderr, "cannot to reopen stdin: %s\n", strerror(errno));
exit(1);
}
}
इस मामले में सौंपा टर्मिनल डिवाइस का पता लगाने के एक सही तरीका क्या है?
लेकिन यह कामकाज सही नहीं है। यह एक मुद्दा तय किया, लेकिन अगला आ रहा है। जब कोई उपयोगकर्ता वर्तमान उपयोगकर्ता से अलग होता है, तो फिर से खोलें त्रुटि अनुमति के साथ विफल रहता है अनुमति से मना कर दी गई है। तो इस कामकाज का उपयोग मेरे उद्देश्यों के लिए नहीं किया जा सकता है।
मैं आपकी समस्या को समझ नहीं पा रहा हूं 'su-user -c' cat'' मेरे टर्मिनल इनपुट और मेरे टर्मिनल में आउटपुट पढ़ता है। "टर्मिनल से पढ़ने के लिए पाइप से पिछली पढ़ाई।", जो मुझे समझ में नहीं आता है। मैं आपको बता रहा हूं कि क्योंकि मुझे XY समस्या पर संदेह है, आप जो करने की कोशिश कर रहे हैं वह बहुत अजीब है। – Stargateur
पेजर stdin से डेटा पढ़ता है, लेकिन इंटरैक्टिव होने के लिए/dev/tty पर स्विच करने की आवश्यकता है। स्विच एक समस्या है। सामान्य अनुप्रयोग यह नहीं करता है, और पेरेंट पर्यावरण द्वारा तैयार stdin, stdout का उपयोग कर। पेजर अलग है - stdin से डेटा पढ़ता है, लेकिन कीबोर्ड को भी पढ़ने की जरूरत है। –