[C++] 270 SDL : テトリス画面収録 その2 psコマンド プロセスID

[M1 Mac, Monterey 12.6.3, clang 13.0.0, SDL 2.26.2, ChatGPT Plus, NO IDE]

CPUの別コアで並列実行した画面収録をゲームオーバー時に自動で終わらせるようにしました。前回発生したx座標のズレは修正済です。

psコマンドでFFmpeg関連のプロセスIDを取得し、順次killコマンドで停止するという内容です。

ただappファイルについては収録開始時に環境設定のセキュリティで画面収録を都度許可する必要がありプレイに支障があります。おそらくApple公証を通せば許可不要になると思います。実行ファイルは問題ありません。

ChatGPTを使うようになってから、プログラミングに関する調査でGoogleを使う頻度が激減しました。ただ一見考えているようで何も考えていないので、自身のコード検証力が問われるところです。

// 文字列分割(psコマンドにおける出力を処理)
vector<string> splitString(string s, string delimiter) {
    vector<string> tokens;
    size_t delimiterPos = s.find(delimiter);
    while (delimiterPos != string::npos) {
        string token = s.substr(0, delimiterPos);
        tokens.push_back(token);
        s.erase(0, delimiterPos + delimiter.length());
        delimiterPos = s.find(delimiter);
    }
    tokens.push_back(s);
    return tokens;
}

// プロセスID取得
vector<string> getProcessID(){
	FILE* pipe = popen("ps -ef | grep ffmpeg", "r");
    if (!pipe) return {};
	
    char buffer[512];
    string output = "";
    while (!feof(pipe)) {
        if (fgets(buffer, 128, pipe) != NULL)
            output += buffer;
    }
    pclose(pipe);

	cout << "output: " << output << endl;
	string userID = output.substr(2, 3);
	cout << "userID: " << userID << endl;

	vector<string> tokens = splitString(output, userID);
	vector<string> processIDs;
	for (int i = 0; i < tokens.size(); i++){
		cout << "token: " << tokens[i] << endl;
		string id = tokens[i].substr(1, 5);
		processIDs.push_back(id);
		cout << "id: " << id << endl;
	}

    return processIDs;
}

// プロセスID停止
void stopProcess(){
	vector<string> ids = getProcessID();

	for (string id: ids){
		string cmd = "kill " + id;

		if(!system(cmd.c_str())){
			cout << "id不適合" << endl;
		};
	}
}