मैं वर्तमान में चल रहे प्रोग्राम के उमास्क को कैसे देख सकता हूं?लिनक्स: पहले से चल रही प्रक्रिया का उमास्क प्राप्त करना?
[अद्यतन:। किसी अन्य प्रक्रिया, नहीं वर्तमान प्रक्रिया]
मैं वर्तमान में चल रहे प्रोग्राम के उमास्क को कैसे देख सकता हूं?लिनक्स: पहले से चल रही प्रक्रिया का उमास्क प्राप्त करना?
[अद्यतन:। किसी अन्य प्रक्रिया, नहीं वर्तमान प्रक्रिया]
आप एक चलने वाली प्रक्रिया को gdb देते हैं और उसके बाद डीबगर में umask कॉल कर सकते हैं:
(gdb) call umask(0)
[Switching to Thread -1217489200 (LWP 11037)]
$1 = 18
(gdb) call umask(18)
$2 = 0
(gdb)
(नोट: 18 = O22)
यह पता चलता है पाने के लिए एक बहुत बदसूरत तरह से हो सकता है ptrace का उपयोग कर उमास्क।
आप मौजूदा प्रक्रिया हैं, तो आप को/tmp करने के लिए एक फ़ाइल में लिखने और इसके सेटिंग की जाँच कर सकते हैं। एक बेहतर समाधान umask (3) को गुजरने के लिए कॉल करना है - फ़ंक्शन कॉल से पहले सेटिंग देता है - और फिर उस मान को वापस उमास्क में पास करके इसे रीसेट करें।
किसी अन्य प्रक्रिया के लिए उमास्क का खुलासा नहीं किया जा रहा है।
GNU सी लाइब्रेरी मैनुअल से:
यहाँ दिखा कैसे यह स्थायी रूप से बदले बिना
umask
साथ मुखौटा को पढ़ने के लिए एक उदाहरण है:mode_t read_umask (void) { mode_t mask = umask (0); umask (mask); return mask; }
हालांकि, यह
getumask
उपयोग करने के लिए बेहतर है यदि आप मास्क मान पढ़ना चाहते हैं, क्योंकि यह पुनर्विक्रेता है (कम से कम यदि आप जीएनयू ऑपरेटिंग सिस्टम का उपयोग करते हैं)।
getumask
ग्लिब-विशिष्ट है, हालांकि। तो यदि आप पोर्टेबिलिटी को महत्व देते हैं, तो गैर-पुनर्वित्त समाधान केवल एक ही है।
संपादित करें: मैंने लिनक्स स्रोत कोड के माध्यम से ->umask
के लिए सिर्फ grepped किया है। वहां कहीं भी नहीं है जो आपको एक अलग प्रक्रिया का उमाक लेगा। इसके अलावा, getumask
नहीं है; जाहिर है कि यह एक हर्ड-केवल चीज है।
हां, गेटुमास्क केवल हर्ड पर है। लिनक्स मैन पेज में यह सहायक नोट है: यह फ़ंक्शन glibc मैन्युअल में प्रलेखित है, लेकिन, जैसा कि glibc संस्करण 2.24 पर है, यह लिनक्स पर लागू नहीं किया गया है। –
एक सहयोगी ने मुझे इसके लिए एक कमांड लाइन पैटर्न दिखाया। मेरे पास हमेशा emacs चल रहा है, तो यह नीचे दिए गए उदाहरण में है। perl
मेरे योगदान है:
sudo gdb --pid=$(pgrep emacs) --batch -ex 'call/o umask(0)' -ex 'call umask($1)' 2> /dev/null | perl -ne 'print("$1\n")if(/^\$1 = (\d+)$/)'
लिनक्स कर्नेल 4.7 के साथ शुरू, umask /proc/<pid>/status
में उपलब्ध है।
वर्तमान प्रक्रिया में से? या एक विदेशी प्रक्रिया? –
एक [पैच] (https://lkml.org/lkml/2012/5/4/451) था जो कुछ समय पहले इसके लिए चला गया था, 'उमास्क इन'/proc/pid/status' और '/ proc/pid/stat'। लेकिन ऐसा लगता है कि यह मुख्य लाइन कर्नेल में नहीं गया है। –
[unix.se] पर एक ही प्रश्न: [पिड के साथ एक प्रक्रिया का वर्तमान उमास्क] (http://unix.stackexchange.com/q/258284) –