前提・実現したいこと
c++で実行中の他のプロセスを一時停止する。
試したこと
このことについて、調べたのですが、system("pause")についてしか乗っておらず、わかりませんでした。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
undocumentな方法ですが
NtSuspendProcess
にて一時停止、NtResumeProcess
にて再開できる可能性があります。
詳細はgithubあたりで検索してください。
投稿2020/08/26 07:19
総合スコア15149
0
OS は何ですか?
Linux なら一時停止したいプロセスの pid に
killシステムコールで、SIGSTOPシグナルを送ればいいでしょう。
C++
1#include <stdio.h> 2#include <sys/types.h> 3#include <signal.h> 4 5int main() 6{ 7 int pid = 1, n; 8 while (printf("pid or 0: "), scanf("%d", &n) == 1) 9 if (n == 0) 10 kill(pid, SIGCONT); 11 else 12 kill(pid = n, SIGSTOP); 13}
このプログラムを実行し pid を入力すれば、そのプロセスは一時停止します。
その後、0 を入力すれば一時停止していたプロセスが再開します。
pid は psコマンドで取得できます。
次のプログラムは、自分のプロセスID を表示し、1秒ごとに [1][2]... と
数字を表示します。
C++
1#include <stdio.h> 2#include <unistd.h> // sleep, getpid 3 4int main() 5{ 6 printf("pid = %d\n", getpid()); 7 for (int i = 0; i < 100; i++) { 8 printf("[%d]", i); 9 fflush(stdout); 10 sleep(1); 11 } 12}
ある端末でこのプログラムを実行し、他の端末で、
先ほどのプログラムを実行してみてください。
追記
Windows でのやり方を調べてみました。
C++
1#include <stdio.h> 2#include <windows.h> 3 4typedef LONG (NTAPI *Func)(HANDLE ProcessHandle); 5 6Func suspendF, resumeF; 7 8void getFunc(DWORD processId) 9{ 10 HANDLE h = GetModuleHandle("ntdll"); 11 suspendF = (Func)GetProcAddress(h, "NtSuspendProcess"); 12 resumeF = (Func)GetProcAddress(h, "NtResumeProcess"); 13} 14 15void suspend(DWORD pid) 16{ 17 HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); 18 suspendF(h); 19 CloseHandle(h); 20} 21 22void resume(DWORD pid) 23{ 24 HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); 25 resumeF(h); 26 CloseHandle(h); 27} 28 29 30int main(void) 31{ 32 int pid = 0, n; 33 while (printf("pid or 0 or 1: "), scanf("%d", &n) == 1) { 34 if (pid == 0) { 35 pid = n; getFunc(pid); suspend(pid); 36 } 37 else if (n == 0) suspend(pid); 38 else if (n == 1) resume(pid); 39 } 40}
pid を入力するとそのプロセスを中断。
後は、1 または 0 を入力すると、再開/中断を繰り返します。
プロセスID は tasklistコマンドで取得できます。
C++
1#include <stdio.h> 2#include <windows.h> 3 4int main(void) 5{ 6 DWORD pid = GetCurrentProcessId(); 7 printf("pid = %d\n", pid); 8 for (int i = 0; i < 100; i++) { 9 printf("[%d]", i); 10 fflush(stdout); 11 Sleep(1000); 12 } 13}
あるコマンドプロンプトでこのプログラムを実行し、
別のコマンドプロンプトで最初のプログラムを実行することで
プロセスの一時停止、再開ができます。
追記2
デバッグ中のコードを貼り付けてしまったので、書き直しました。
投稿2020/08/25 16:05
編集2020/08/26 08:30総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。