2008-10-03 21 views
24

मैं वर्तमान में चल रहे प्रोग्राम के उमास्क को कैसे देख सकता हूं?लिनक्स: पहले से चल रही प्रक्रिया का उमास्क प्राप्त करना?

[अद्यतन:। किसी अन्य प्रक्रिया, नहीं वर्तमान प्रक्रिया]

+0

वर्तमान प्रक्रिया में से? या एक विदेशी प्रक्रिया? –

+0

एक [पैच] (https://lkml.org/lkml/2012/5/4/451) था जो कुछ समय पहले इसके लिए चला गया था, 'उमास्क इन'/proc/pid/status' और '/ proc/pid/stat'। लेकिन ऐसा लगता है कि यह मुख्य लाइन कर्नेल में नहीं गया है। –

+0

[unix.se] पर एक ही प्रश्न: [पिड के साथ एक प्रक्रिया का वर्तमान उमास्क] (http://unix.stackexchange.com/q/258284) –

उत्तर

25

आप एक चलने वाली प्रक्रिया को gdb देते हैं और उसके बाद डीबगर में umask कॉल कर सकते हैं:

(gdb) call umask(0) 
[Switching to Thread -1217489200 (LWP 11037)] 
$1 = 18 
(gdb) call umask(18) 
$2 = 0 
(gdb) 

(नोट: 18 = O22)

यह पता चलता है पाने के लिए एक बहुत बदसूरत तरह से हो सकता है ptrace का उपयोग कर उमास्क।

+1

धन्यवाद! और उमास्क वापस सेट करने के लिए अनुस्मारक के लिए बोनस कृतज्ञता! –

+2

यदि आप उलझन में हैं जैसे मैं था - लाइन '$ 1 = 18' का अर्थ है कि प्रक्रिया उमास्क पहले 18 (ऑक्टेटल में 022) थी। – njahnke

+1

बेहतर: कॉल/ओ उमास्क (027) – MarcH

1

आप मौजूदा प्रक्रिया हैं, तो आप को/tmp करने के लिए एक फ़ाइल में लिखने और इसके सेटिंग की जाँच कर सकते हैं। एक बेहतर समाधान umask (3) को गुजरने के लिए कॉल करना है - फ़ंक्शन कॉल से पहले सेटिंग देता है - और फिर उस मान को वापस उमास्क में पास करके इसे रीसेट करें।

किसी अन्य प्रक्रिया के लिए उमास्क का खुलासा नहीं किया जा रहा है।

9

GNU सी लाइब्रेरी मैनुअल से:

यहाँ दिखा कैसे यह स्थायी रूप से बदले बिना umask साथ मुखौटा को पढ़ने के लिए एक उदाहरण है:

mode_t 
read_umask (void) 
{ 
    mode_t mask = umask (0); 
    umask (mask); 
    return mask; 
} 

हालांकि, यह getumask उपयोग करने के लिए बेहतर है यदि आप मास्क मान पढ़ना चाहते हैं, क्योंकि यह पुनर्विक्रेता है (कम से कम यदि आप जीएनयू ऑपरेटिंग सिस्टम का उपयोग करते हैं)।

getumask ग्लिब-विशिष्ट है, हालांकि। तो यदि आप पोर्टेबिलिटी को महत्व देते हैं, तो गैर-पुनर्वित्त समाधान केवल एक ही है।

संपादित करें: मैंने लिनक्स स्रोत कोड के माध्यम से ->umask के लिए सिर्फ grepped किया है। वहां कहीं भी नहीं है जो आपको एक अलग प्रक्रिया का उमाक लेगा। इसके अलावा, getumask नहीं है; जाहिर है कि यह एक हर्ड-केवल चीज है।

+0

हां, गेटुमास्क केवल हर्ड पर है। लिनक्स मैन पेज में यह सहायक नोट है: यह फ़ंक्शन glibc मैन्युअल में प्रलेखित है, लेकिन, जैसा कि glibc संस्करण 2.24 पर है, यह लिनक्स पर लागू नहीं किया गया है। –

0

एक सहयोगी ने मुझे इसके लिए एक कमांड लाइन पैटर्न दिखाया। मेरे पास हमेशा 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+)$/)' 
2

लिनक्स कर्नेल 4.7 के साथ शुरू, umask /proc/<pid>/status में उपलब्ध है।