質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

4424閲覧

実行中の他のプロセスを一時停止する

_string

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/08/25 14:14

前提・実現したいこと

c++で実行中の他のプロセスを一時停止する。

試したこと

このことについて、調べたのですが、system("pause")についてしか乗っておらず、わかりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

undocumentな方法ですが
NtSuspendProcessにて一時停止、NtResumeProcessにて再開できる可能性があります。
詳細はgithubあたりで検索してください。

参考

投稿2020/08/26 07:19

asm

総合スコア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
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_string

2020/08/26 05:59

返信遅くなってすみません。 Windowsだと一時停止することができないんですね...! Linuxを持っていないので、環境を整えてやってみます:)
guest

0

ベストアンサー

c++で実行中の他のプロセスを一時停止する。

できません。

そのプロセスに、何らかの通信により、一時停止するようなコードを組み込んでいるなら話は別ですが

投稿2020/08/25 14:18

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_string

2020/08/25 14:39

了解です。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問