From patchwork Tue Feb 14 12:25:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Liang X-Patchwork-Id: 1742322 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.linux.it (client-ip=213.254.12.146; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Received: from picard.linux.it (picard.linux.it [213.254.12.146]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PGL5b06Mfz23hX for ; Tue, 14 Feb 2023 23:25:38 +1100 (AEDT) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id DC6983CC5A5 for ; Tue, 14 Feb 2023 13:25:35 +0100 (CET) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-5.smtp.seeweb.it (in-5.smtp.seeweb.it [217.194.8.5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by picard.linux.it (Postfix) with ESMTPS id 9733A3C0204 for ; Tue, 14 Feb 2023 13:25:33 +0100 (CET) Received: from Atcsqr.andestech.com (60-248-80-70.hinet-ip.hinet.net [60.248.80.70]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by in-5.smtp.seeweb.it (Postfix) with ESMTPS id 3A2C66007BF for ; Tue, 14 Feb 2023 13:25:29 +0100 (CET) Received: from mail.andestech.com (ATCPCS16.andestech.com [10.0.1.222]) by Atcsqr.andestech.com with ESMTP id 31ECPN6J073985; Tue, 14 Feb 2023 20:25:23 +0800 (+08) (envelope-from ycliang@andestech.com) Received: from atctrx.andestech.com (10.0.15.173) by ATCPCS16.andestech.com (10.0.1.222) with Microsoft SMTP Server id 14.3.498.0; Tue, 14 Feb 2023 20:25:22 +0800 From: Leo Yu-Chi Liang To: Date: Tue, 14 Feb 2023 20:25:08 +0800 Message-ID: <20230214122509.2957225-1-ycliang@andestech.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Originating-IP: [10.0.15.173] X-DNSRBL: X-SPAM-SOURCE-CHECK: pass X-MAIL: Atcsqr.andestech.com 31ECPN6J073985 X-Virus-Scanned: clamav-milter 0.102.4 at in-5.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=0.4 required=7.0 tests=PDS_RDNS_DYNAMIC_FP, RDNS_DYNAMIC,SPF_HELO_NONE,SPF_PASS autolearn=disabled version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on in-5.smtp.seeweb.it Subject: [LTP] [v2 1/2] lib/tst_pid.c: Count used pid by traversing /proc X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" Use "ps -eT | wc -l" to calculate the number of used pid could have an incorrectly larger result because "ps -eT" may list the same pid multiple times (with different SPID). Instead, we could count used pid by traversing /proc directory and countng the subdirectories that have name composed of digits. Suggested-by: Petr Vorel Signed-off-by: Leo Yu-Chi Liang Reviewed-by: Petr Vorel --- Changes v1 -> v2 * Split into two patches --- lib/tst_pid.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/lib/tst_pid.c b/lib/tst_pid.c index 5595e79bd..a282f8cc9 100644 --- a/lib/tst_pid.c +++ b/lib/tst_pid.c @@ -18,6 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include #include @@ -113,21 +114,16 @@ static int get_session_pids_limit(void (*cleanup_fn) (void)) int tst_get_free_pids_(void (*cleanup_fn) (void)) { - FILE *f; - int rc, used_pids, max_pids, max_session_pids, max_threads; - - f = popen("ps -eT | wc -l", "r"); - if (!f) { - tst_brkm(TBROK, cleanup_fn, "Could not run 'ps' to calculate used pids"); - return -1; - } - rc = fscanf(f, "%i", &used_pids); - pclose(f); - - if (rc != 1 || used_pids < 0) { - tst_brkm(TBROK, cleanup_fn, "Could not read output of 'ps' to calculate used pids"); - return -1; + DIR *f; + struct dirent *ent; + int max_pids, max_session_pids, max_threads, used_pids = 0; + + f = SAFE_OPENDIR("/proc"); + while ((ent = SAFE_READDIR(f))) { + if (isdigit(ent->d_name[0])) + ++used_pids; } + SAFE_CLOSEDIR(f); SAFE_FILE_SCANF(cleanup_fn, PID_MAX_PATH, "%d", &max_pids); SAFE_FILE_SCANF(cleanup_fn, THREADS_MAX_PATH, "%d", &max_threads);