2008-10-03 27 views
24

Làm cách nào để kiểm tra umask của chương trình hiện đang chạy?linux: nhận được umask của một quá trình đã chạy?

[update:. Một quá trình, không phải là quá trình hiện tại]

+0

Trong quá trình hiện tại? Hoặc một quá trình nước ngoài? –

+0

Đã có [bản vá] (https://lkml.org/lkml/2012/5/4/451) đã diễn ra trong một thời gian trước đây, để báo cáo quá trình 'umask trong'/proc/pid/status' và '/ proc/pid/stat'. Nhưng nó dường như không đi vào hạt nhân đường chính. –

+0

Cùng một câu hỏi trên [unix.se]: [umask hiện tại của một quá trình với pid] (http://unix.stackexchange.com/q/258284) –

Trả lời

25

Bạn có thể đính kèm gdb để một quá trình đang chạy và sau đó gọi umask trong debugger:

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

(lưu ý: 18 = O22)

Điều này cho thấy rằng có thể có một cách thực sự xấu xí để có được umask sử dụng ptrace.

+1

Cảm ơn! và cảm ơn tiền thưởng cho lời nhắc để đặt lại umask! –

+2

Nếu bạn bối rối như tôi - dòng '$ 1 = 18' có nghĩa là umask quá trình trước đây là 18 (022 trong bát phân). – njahnke

+1

Tốt hơn: gọi/o umask (027) – MarcH

1

Nếu bạn là quá trình hiện tại, bạn có thể viết một tập tin vào/tmp và kiểm tra thiết lập của nó. Một giải pháp tốt hơn là gọi umask (3) đi qua số không - hàm trả về cài đặt trước cuộc gọi - và sau đó đặt lại nó bằng cách chuyển giá trị đó trở lại umask.

Mặt nạ cho một quy trình khác dường như không bị lộ.

9

Từ hướng dẫn Thư viện GNU C:

Dưới đây là một ví dụ cho thấy làm thế nào để đọc các mặt nạ với umask mà không thay đổi vĩnh viễn:

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

Tuy nhiên, nó là tốt hơn để sử dụng getumask nếu bạn chỉ muốn đọc giá trị mặt nạ, bởi vì nó là reentrant (ít nhất là nếu bạn sử dụng hệ điều hành GNU).

getumask là đặc trưng glibc. Vì vậy, nếu bạn coi trọng tính di động, thì giải pháp không reentrant là giải pháp duy nhất có.

Chỉnh sửa: Tôi vừa mới gặt hái ->umask tất cả thông qua mã nguồn Linux. Không có nơi nào sẽ giúp bạn có được umask của một quá trình khác. Ngoài ra, không có getumask; dường như đó chỉ là một điều Hurd.

+0

Có, getumask chỉ trên Hurd. Trang người dùng Linux có lưu ý hữu ích này: Hàm này được ghi lại trong sách hướng dẫn glibc, nhưng, như ở phiên bản glibc 2.24, nó không được triển khai trên Linux. –

0

Một đồng nghiệp chỉ cho tôi xem mẫu dòng lệnh cho việc này. Tôi luôn luôn có emacs chạy, vì vậy đó là trong ví dụ dưới đây. Các perl là sự đóng góp của tôi:

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

Bắt đầu với Linux kernel 4.7, umask có sẵn trong /proc/<pid>/status.

Các vấn đề liên quan