मैं लिनक्स पर एक साधारण खोल बनाने पर अपना सर्वश्रेष्ठ प्रयास कर रहा हूं। बस बुनियादी प्रणाली कॉल का उपयोग करने के तरीके को सीखने के लिए मैं कुछ बना सकता हूं।लिनक्स पर उपयोगकर्ता इनपुट से निपटने
परिदृश्य: आदेश में उपयोगकर्ता प्रकार, प्रेस टैब (ताकि खोल अपने आदेश स्वत: पूर्ण करता है), स्वत: पूर्ण आदेश बाहर पॉप (या सुझाव), उपयोगकर्ता प्रेस दर्ज करें, आदेश evals और कार्यान्वित ।
बस बैश की तरह।
मुझे पता चला है कि कैसे evals बनाने के लिए, आदेश टोकन में परिवर्तित करें, इसे पाइप और सामान के साथ निष्पादित करें। जो मैं समझ नहीं सकता वह इनपुट हिस्सा है। अर्थात् उन टैब कीस्ट्रोक।
मैं जानता हूँ कि मैं क्या विकल्प हैं:
getc()
- अलग से हर किरदार मिलता है एक बफर में संग्रहीत। टैब कीस्ट्रोक कैसे प्राप्त करें, यह पता नहीं लगा सकता है, क्योंकि यह निष्पादन रोकता है जब तक कि यह '\ n' या Ctrl + D दिखाई देता है। किंडा महंगा है, क्योंकि कमांड में प्रत्येक चरित्र के लिए 1 getc() होगा। इसके अलावा, मुझे बफर रीयलोकेशन, अमूर्तकरण ... बू ...scanf("%s")
- बफर ओवरफ़्लो के बारे में बहुत चिंताजनक होगा। मैं उन टैब कीस्ट्रोक नहीं प्राप्त कर सकता हूं। निष्पादन रोकता हैread()
(unistd.h से) - ऐसा कुछ हो सकता है जो मैं नहीं कर सकता। लेकिन मैंने यहां लोगों को देखा है जिन्होंने कहा कि यह करने के लिए इसका उपयोग करने के लिए एक वास्तविक दर्द है। मैंने जाँचा। यह है।getline()
- टैब कीस्ट्रोक नहीं मिल सकता है।
मैंने यह देखने के लिए बैश स्रोत कोड में देखा, यह इनपुट के साथ कैसे व्यवहार करता है, और हे भगवान! इस एक साधारण चीज़ (input.c फ़ाइल) करने के लिए समर्पित कोड की 450 लाइनें हैं।
क्या इससे वास्तव में कोई आसान समाधान नहीं है? मैं ncurses का उपयोग नहीं करना चाहता, मुझे पोर्टेबिलिटी की परवाह नहीं है, मैं सिर्फ एक लक्ष्य प्राप्त नहीं करना चाहता: उपयोगकर्ता इनपुट प्राप्त करना और टैब कुंजी दबाते समय जानना। जितना संभव हो उतना कम प्रयास के साथ, इसे सुंदर ढंग से करें।
'if (fgetc (stdin) == '\ t') {// launch}' –
@self: निष्पादन रोकता है। "लॉन्च" भाग केवल एंटर दबाए जाने के बाद ही निष्पादित होता है। प्रवेश करने से पहले मुझे इस चरित्र को प्राप्त करने की आवश्यकता है, इसलिए मैं इनपुट स्ट्रीम में पहले से लिखे गए कार्यों के लिए स्वत: पूर्णता कर सकता हूं। –
इसे 'for (;;)' लूप में उपयोग करें, एक बार जब आप \ n' अन्य सभी इनपुट –