2010-07-06 17 views
5

को नियंत्रित कर रहा है, तो मेरे पास एक tty है (चलिए कहते हैं/dev/tty5) और जानना चाहते हैं कि वर्तमान में यह प्रक्रिया समूह या सत्र का नियंत्रण टीटी है या नहीं वर्तमान में प्रसिद्ध है। पीओएसईक्स में दो एपीआई फ़ंक्शंस हैं जो स्वयं को यहां बताते हैं: tcgetpgrp() और tcgetsid(), जिनमें से दोनों केवल काम करते हैं, हालांकि कॉलर के पास tty को नियंत्रित करने के रूप में tty है - जो इस मामले में उन्हें अधिक बेकार बनाता है (और वास्तव में मैं नहीं करता हूं ' tcgetsid() बिल्कुल बिंदु देखें नहीं।यह पता लगाने के लिए कि क्या एक लिनक्स टीटीई एक प्रक्रिया समूह

किसी के पास कोई सुझाव है कि मैं सी से, कैसे एक टर्मिनल वर्तमान में एक प्रक्रिया का नियंत्रण टर्मिनल है, मैं सी से कैसे पता लगा सकता हूं? मुझे केवल लिनक्स की परवाह है, इसलिए यदि लिनक्स-विशिष्ट एपीआई आवश्यक हैं तो मेरे साथ ठीक है।

उत्तर

1

बीएसडी: int ioctl (int tty, TIOCGETPGRP, int * foreground_group);

लिनक्स: int tcgetpgrp (int tty, int * foreground_group);

लिनक्स केवल तभी काम करता है जब आप गैर-स्वामित्व वाले टर्मिनल को अनुमति देते हैं, यानी, आप रूट हैं। यह एक जानबूझकर सुरक्षा लागू है। बीएसडी ioctl() किसी भी प्रक्रिया समूह (या यहां तक ​​कि nonexistant प्रक्रिया समूहों) को अपने अग्रभूमि tty के रूप में लेने के लिए किसी भी tty अनुमति देता है। POSIX केवल उन समूहों को संसाधित करने की अनुमति देता है जिनके नियंत्रण में टीटीआई है। यह सीमा बीएसडी ioctl में मौजूद कुछ संदिग्ध और सुरक्षा-कमजोर मामलों को अस्वीकार करती है।

आप क्या करने की कोशिश कर रहे हैं? यदि आप कर्नेल वितरित सिग्नल हैं तो आपको केवल प्रक्रिया-नियंत्रण टीटी के बारे में चिंता करनी चाहिए।

संपादित करें: मैं भूल गया/proc
www.die.net से: /proc/[संख्या]/FD यह जो प्रक्रिया खुला है प्रत्येक फ़ाइल के लिए एक प्रविष्टि युक्त उप-निर्देशिका है, इसका फ़ाइल वर्णनकर्ता द्वारा नामित , और जो वास्तविक फ़ाइल के लिए एक प्रतीकात्मक लिंक है। इस प्रकार, 0 मानक इनपुट, 1 मानक आउटपुट, 2 मानक त्रुटि, आदि

+0

मेरे मूल प्रश्न में मैंने पहले से ही यह बताने की कोशिश की कि tcgetpgrp() अधिकतर बेकार क्यों है, सी कोड स्निपेट देखें। कारण यह है कि मैं यह जानना चाहता हूं कि गेट्टी या टर्मिनल पर पहले से ही सक्रिय है या नहीं। मुझे टीटीई लिखने के लिए खुले अन्य प्रक्रियाओं की परवाह नहीं है (जो लॉगिंग के लिए हो सकता है, यड्डा यड्डा), मैं जानना चाहता हूं कि वास्तव में कोई इसे पढ़ रहा/नियंत्रित कर रहा है या नहीं। और एक ला lsof के माध्यम से जा रहा है मैं "sane" नहीं कहता है ... – user175104

+0

यह सब वहाँ है। जब तक आप कर्नेल मोड डेटा तक नहीं पहुंचते, या आप रूट हैं तो आप उपयोगकर्ता मोड कॉल के साथ जो वर्णन करते हैं वह नहीं कर सकते हैं। लिनक्स में नहीं कारण: सुरक्षा। और मुझे खेद है अगर यह आपकी परिभाषा को अपमानित करता है। इसे Ulrich Drepper के साथ ले लो। –

0

इसे सिस्टम कॉल "ps au> tempfile.txt" के रूप में निष्पादित करें, और फ़ाइल को पार्स करें।

0

सुनिश्चित नहीं हैं कि अगर यह वास्तव में अपनी जरूरत पकड़ता, वैसे भी यहाँ यह है:

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    int status = system("fuser /dev/tty1 >/dev/null 2>/dev/null") >> 8; 
    printf("%s", 
     status ? 
      "tty not in use as a text terminal.\n" : 
      "tty in use as a text terminal.\n"); 
    return 0; 
} 
+0

कि 'fuser' प्रक्रिया शायद कुछ सी लाइब्रेरी फ़ंक्शन को फिर से कॉल करे .. क्यों नहीं उस फ़ंक्शन को सीधे अपने प्रोग्राम में कॉल करें? : पी – vdboor

+0

@ 'vbdoor':' fuser' के बराबर एक सी लाइब्रेरी फ़ंक्शन मौजूद नहीं है। 'फ्यूसर' एक लिनक्स प्रोग्राम है जो बहुत सारी लाइब्रेरी कॉल करता है: 'sed -n' s/^ \ (। * \) (। */\ 1/g; p '<<(ltrace fuser/dev/tty1 2 > और 1) | मेरे पीसी पर सॉर्ट-यू' आउटपुट है: 'bindtextdomain बंद बंदरगाह fclose fgets fopen64 मुफ्त __fxstat64 getpid __libc_start_main malloc opendir readdir64 setlocale __snprintf_chk सॉकेट sscanf strchr __strdup strtol textdomain __xstat64'। :) –

0

आप एक प्रक्रिया की नियंत्रित tty क्वेरी करने के लिए, अगर आप इस प्रक्रिया के पीआईडी ​​पता proc फाइल सिस्टम का उपयोग कर सकते हैं।

/proc // fd/0 tty (say/dev/pts/4) के लिए एक प्रतीकात्मक लिंक है।

तो तुम सब करने की जरूरत है पीआईडी ​​के साथ एक proc पथ बना है (जैसे:/proc/7834/fd/0, जहां 7834 पीआईडी ​​है) और फिर tty

पाने के लिए readlink सिस्टम कॉल फोन

संबंधित मुद्दे