Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 프로세스 종료

<시간/>

n개의 프로세스가 있다고 가정합니다. 여기서 각 프로세스에는 PID 또는 프로세스 ID라는 고유한 ID가 있고 해당 PPID(상위 프로세스 ID)도 있습니다.

각 프로세스에는 하나의 상위 프로세스만 있지만 하나 이상의 하위 프로세스가 있을 수 있습니다.

이것은 트리 구조와 같습니다. 하나의 프로세스만 PPID =0을 가지며 이는 이 프로세스에 상위 프로세스가 없음을 의미합니다. 모든 PID는 고유한 양의 정수입니다.

두 개의 정수 목록을 사용하여 프로세스 목록을 나타냅니다. 첫 번째 목록에는 각 프로세스에 대한 PID가 포함되고 두 번째 목록에는 해당 PPID가 포함됩니다. 따라서 두 개의 목록과 우리가 죽이고자 하는 프로세스를 나타내는 PID가 있는 경우, 결국 죽게 될 프로세스의 PID 목록을 찾아야 합니다. 그리고 프로세스가 종료되면 모든 자식 프로세스가 종료된다고 가정해야 합니다.

따라서 입력이 pid =[1, 3, 10, 5] ppid =[3, 0, 5, 3] kill =5와 같으면 출력은 [5,10],

C++에서 프로세스 종료

5명을 죽이면 10명도 죽입니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 하나의 지도 자식 정의

  • n :=pid의 크기

  • ret 배열 정의

  • initialize i :=0의 경우, i

    • 유 :=ppid[i]

    • v :=pid[i]

    • 자식[u]

      끝에 v 삽입
  • 하나의 대기열 정의 q

  • q에 kill 삽입

  • 동안(q가 비어 있지 않음) -

    를 수행합니다.
    • curr :=q의 첫 번째 요소

    • q에서 요소 삭제

    • ret 끝에 curr 삽입

    • for initialize i :=0, i

      • q

        에 자식[curr, i] 삽입
  • 리턴 렛

예시

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

#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));
}

입력

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

출력

[5, 10, ]