2009-03-02 40 views
12

Chúng ta có một tác vụ C++ sẽ chia rẽ một quá trình mới. Quá trình đó lần lượt có thể có một số tiến trình con. Nếu nhiệm vụ chạy qua một thời gian quy định, chúng tôi sẽ muốn giết quá trình chia đôi đó. Tuy nhiên, chúng tôi không muốn mồ côi các quá trình mà nó đã sinh ra. Chúng tôi muốn tất cả họ chết. Tôi đã sử dụng Process Explorer và nó có một tùy chọn "Kill Process Tree", tương tự như "End Process Tree" của Windows Task Manager, vì vậy tôi đoán/giả sử có một API công cộng để làm điều này. Có ai làm điều này, hoặc biết một tham chiếu đến một API công cộng nào?Thực hiện tương đương với "Kill Process Tree" trong C++ trên windows

Thx, Brett

+0

Tôi tin rằng Task Manager không nhiều điều mà không phải là có sẵn thông qua các API công cộng. – jdigital

+0

trong khi tôi sẽ không có vấn đề tin tưởng rằng;) thực tế là Process Explorer hiện nó làm cho tôi tự hỏi. Tôi tin rằng nó đã được viết trước khi công ty được mua lại MS của tôi. –

+0

Vâng, nhưng người đã viết quá trình thám hiểm - Mark Russinovich - được sử dụng để làm việc cho Microsoft trên Windows NT (trước khi có công ty của ông mua bởi Microsoft) và ông đã viết cuốn sách về nội bộ Windows. http://www.microsoft.com/learning/en/us/books/12069.aspx –

Trả lời

18

Bạn có thể muốn xem xét việc "Jobs API". CreateJobObject và bạn bè. Bạn có thể thực thi các quy trình con để ở trong Công việc, bằng cách thiết lập thuộc tính thích hợp. Sau đó, bạn có thể gọi TerminateJobObject bất cứ khi nào bạn muốn.

Làm rõ: đây KHÔNG phải là những gì mà Trình quản lý tác vụ thực hiện.

+1

theo dõi, nếu quá trình chia đôi đó chết và mồ côi công việc của nó, thì TerminateJobObject vẫn có thể giết những đứa trẻ mồ côi để lại? –

+2

Có, hãy xem tài liệu API có liên quan. Trừ khi quy trình được tạo bằng cờ CREATE_BREAKAWAY_FROM_JOB. – EFraim

+2

Mặc dù không thể chạy đi nếu giới hạn JOB_OBJECT_LIMIT_BREAKAWAY_OK trong đối tượng công việc không được đặt. – EFraim

4

Có chức năng Win32 được gọi là TerminateProcess(). Nó sẽ làm công việc cho bạn.

Hoặc, tôi đã tìm thấy lệnh taskkill hữu ích cho những thứ như thế này.

từ dòng lệnh:

taskkill /F /T /IM program.exe 

từ mã:

system("taskkill /F /T /IM program.exe"); 

switch khác (trực tiếp từ taskkill /?):

 TASKKILL [/S system [/U username [/P 
[password]]]] 
      { [/FI filter] [/PID processid | /IM imagename] } [/F] [/T] 

Description: 
    This command line tool can be used to end one or more processes. 
    Processes can be killed by the process id or image name. 

Parameter List: 
    /S system   Specifies the remote system to connect to. 

    /U [domain\]user Specifies the user context under which 
          the command should execute. 

    /P [password]  Specifies the password for the given 
          user context. Prompts for input if omitted. 

    /F      Specifies to forcefully terminate 
          process(es). 

    /FI filter   Displays a set of tasks that match a 
          given criteria specified by the filter. 

    /PID process id  Specifies the PID of the process that 
          has to be terminated. 

    /IM image name  Specifies the image name of the process 
          that has to be terminated. Wildcard '*' 
          can be used to specify all image names. 

    /T      Tree kill: terminates the specified process 
          and any child processes which were started by it. 

    /?      Displays this help/usage.

-John

+5

TerminateProcess không tự động giết tất cả các tiến trình con. – Cray

1

Bạn muốn tìm id quá trình cho quá trình bạn muốn giết, sau đó "đi bộ cây" của con cái của nó (và con cái của họ, v.v ...), ghi chú pids của họ, và sau đó giết tất cả các quy trình tốt đẹp và nhanh chóng.

6

Tôi khuyên bạn nên đi tuyến đối tượng công việc, như được chỉ ra ở trên, nó sẽ là đáng tin cậy nhất. Nếu bạn không thể đi theo tuyến đối tượng công việc, bạn có thể sử dụng API công cụ trợ giúp để lấy ID tiến trình của cha và xây dựng cây theo cách đó. Tuy nhiên, hãy thận trọng vì Windows không có mối quan hệ cha mẹ/con mạnh và có khả năng PID sẽ được tái chế. Bạn có thể sử dụng GetProcessTimes để truy vấn thời gian tạo của quy trình và kiểm tra xem nó có lớn hơn con không. Nếu một quá trình trung gian trong cây bị chấm dứt, bạn sẽ không thể đi bộ thêm được nữa.

// Error handling removed for brevity 
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
PROCESSENTRY32 process; 
ZeroMemory(&process, sizeof(process)); 
process.dwSize = sizeof(process); 
Process32First(snapshot, &process); 
do 
{ 
    // process.th32ProcessId is the PID. 
    // process.th32ParentProcessID is the parent PID. 

} while (Process32Next(snapshot, &process)); 
+1

Vâng, đây là những gì bạn cần sử dụng trên Vista. –

+0

Bạn cũng cần trên XP. – bltxd

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