2009-09-11 23 views
9

Trong không gian người dùng Linux, tôi có một quá trình chặn trên một semaphore, như được tìm thấy bởi strace. Khi điều kiện lỗi xảy ra, việc chặn có thể lặp lại, do đó, phải có một quy trình khác có chứa semaphore và không giải phóng nó.Làm thế nào để hiển thị quá trình hiện đang nắm giữ một semaphore?

Có cách nào để biết quy trình nào khác hiện đang tổ chức semaphore?

ipcs liệt kê semaphore, do đó,/proc/sysvipc/sem. Tôi có thể tìm thông tin về quy trình lưu giữ ở đâu?

Trả lời

4

Semaphores không mutexes. Bạn không "giữ" chúng. Nếu quá trình bị chặn, điều đó có nghĩa là nó đang chờ người khác thực hiện thao tác "lên" hoặc "V" trong tương lai. Không có công cụ hạt nhân nào cho bạn biết hành vi của phần mềm trong tương lai sẽ như thế nào.

0

Bạn có thử

ipcs -p 
+0

Không có vẻ để làm việc với semaphore. Tôi có thể thấy chìa khóa tất cả các quyền, nhưng ipcs -p -s sản lượng không có đầu ra. – 0x6adb015

3

Có thể có cách dễ dàng hơn nhưng bạn có thể sử dụng lệnh semctl() với lệnh GETPID cmd. Điều đó sẽ trả về quá trình thực thi semop cuối cùng() gọi cho semaphore. Điều này có thể hoặc không thể là quá trình lừa đảo của bạn nhưng nó có lẽ là một gợi ý tốt.

0

"ipcs -p" không thể hiển thị các ẩn dụ của quá trình giữ, đó phải là một lỗi, hoặc đó là một giới hạn bởi vì rất khó để hiển thị. Bạn phải truy vấn bởi yourslef.

  1. chạy "TVV -s" để có được tất cả semId
  2. cho mỗi semId chạy "TVV -s -i"
  3. cho mỗi semnum, để có được chủ sở hữu pid, nếu chủ sở hữu pid là bạn muốn , sau đó hiển thị semid và semnum hiện tại.

Lưu ý: nếu quá trình này chỉ đọc các ẩn dụ, thì bạn không thể nhận được thông tin như vậy thông qua lệnh ipcs.

1

Để tìm PID kết hợp với danh sách các Mảng Semaphore được liệt kê bởi ipcs -s bạn có thể chạy này:

for pid in $(for semid in $(sudo ipcs -s | awk '/0x/{ print $2 }'); do sudo ipcs -s -i $semid | tail -2 | head -1 | awk '{print $5}'; done | sort -u); do ps uh -p $pid; done 
Các vấn đề liên quan