Computer >> Máy Tính >  >> Lập trình >> C ++

Kill Process trong C ++

Giả sử chúng ta có n quy trình, ở đây mỗi quy trình có một id duy nhất được gọi là PID hoặc id quy trình và PPID (id quy trình mẹ) của nó cũng ở đó.

Mỗi quy trình chỉ có một quy trình mẹ, nhưng có thể có một hoặc nhiều quy trình con.

Đây cũng giống như một cấu trúc cây. Chỉ một quy trình có PPID =0, có nghĩa là quy trình này không có quy trình mẹ. Tất cả các PID sẽ là số nguyên dương duy nhất.

Chúng tôi sẽ sử dụng hai danh sách các số nguyên để đại diện cho danh sách các quy trình, trong đó danh sách đầu tiên chứa PID cho mỗi quy trình và danh sách thứ hai chứa PPID tương ứng. Vì vậy, nếu chúng ta có hai danh sách và một PID đại diện cho một quá trình mà chúng ta muốn loại bỏ, thì cuối cùng chúng ta phải tìm một danh sách các PID của các quá trình sẽ bị giết. Và chúng ta nên giả định rằng khi một quy trình bị giết, tất cả các quy trình con của nó sẽ bị giết.

Vì vậy, nếu đầu vào giống như pid =[1, 3, 10, 5] ppid =[3, 0, 5, 3] kill =5, thì đầu ra sẽ là [5,10],

Kill Process trong C ++

Giết 5 cũng sẽ giết 10.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định một bản đồ con

  • n:=kích thước của pid

  • Xác định ret mảng

  • để khởi tạo i:=0, khi i

    • u:=ppid [i]

    • v:=pid [i]

    • chèn v vào cuối con [u]

  • Xác định một hàng đợi q

  • chèn kill vào q

  • while (không phải q trống), do -

    • curr:=phần tử đầu tiên của q

    • xóa phần tử khỏi q

    • chèn curr vào cuối ret

    • để khởi tạo i:=0, khi tôi

      • chèn con [curr, i] vào q

  • trả lại ret

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   vector<int> killProcess(vector<int>& pid, vector<int>& ppid, int kill) {
      map<int, vector<int> > child;
      int n = pid.size();
      vector<int> ret;
      for (int i = 0; i < n; i++) {
         int u = ppid[i];
         int v = pid[i];
         child[u].push_back(v);
      }
      queue<int> q;
      q.push(kill);
      while (!q.empty()) {
         int curr = q.front();
         q.pop();
         ret.push_back(curr);
         for (int i = 0; i < child[curr].size(); i++) {
            q.push(child[curr][i]);
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,3,10,5}, v1 = {3,0,5,3};
   print_vector(ob.killProcess(v, v1, 5));
}

Đầu vào

{1,3,10,5},{3,0,5,3},5

Đầu ra

[5, 10, ]