]> granicus.if.org Git - procps-ng/commitdiff
testsuite: Add check for shared memory
authorCraig Small <csmall@dropbear.xyz>
Tue, 26 Apr 2022 12:04:05 +0000 (22:04 +1000)
committerCraig Small <csmall@dropbear.xyz>
Tue, 26 Apr 2022 12:04:05 +0000 (22:04 +1000)
Created a test process test_shm that allocates a shared memory
segment and prints the segment ID. pmap testsuite runs pmap to
check that the segment is found.

The value returned by shmget() is the same value that is printed
in the fifth column /proc/<PID>/maps

Signed-off-by: Craig Small <csmall@dropbear.xyz>
Makefile.am
lib/.gitignore
lib/test_shm.c [new file with mode: 0644]
testsuite/config/unix.exp
testsuite/pmap.test/pmap.exp

index 4059e1303a3bc05d54efa024538247e89d0883ad..862a990adb14f3fe379aa04d27039f90a3426d1c 100644 (file)
@@ -326,7 +326,8 @@ check_PROGRAMS = \
        lib/test_strutils \
        lib/test_fileutils \
        lib/test_process \
-       lib/test_strtod_nol
+       lib/test_strtod_nol \
+       lib/test_shm
 
 lib_test_strutils_SOURCES = lib/test_strutils.c lib/strutils.c
 lib_test_strutils_LDADD = $(CYGWINFLAGS)
@@ -336,6 +337,8 @@ lib_test_process_SOURCES = lib/test_process.c
 lib_test_process_LDADD = $(CYGWINFLAGS)
 lib_test_strtod_nol_SOURCES = lib/test_strtod_nol.c lib/strutils.c
 lib_test_strtod_nol_LDADD = $(CYGWINFLAGS)
+lib_test_shm_SOURCES = lib/test_shm.c lib/strutils.c
+lib_test_shm_LDADD = $(CYGWINFLAGS)
 
 check_PROGRAMS += \
        proc/test_Itemtables \
index 7eb5747e63a2f7ae0fe49d99027165405a4725bb..8d6947f1bef7e3b960136a7b29da48d2386c6b81 100644 (file)
@@ -3,5 +3,6 @@
 test_fileutils
 test_nsutils
 test_process
+test_shm
 test_strutils
 test_strtod_nol
diff --git a/lib/test_shm.c b/lib/test_shm.c
new file mode 100644 (file)
index 0000000..7643f7f
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * test_shm -- program to create a shared memory segment for testing
+ *
+ * Copyright 2022 Craig Small <csmall@dropbear.xyz>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/shm.h>
+#include "c.h"
+
+#define DEFAULT_SLEEPTIME 300
+#define SHM_SIZE 50
+
+static void usage(void)
+{
+    fprintf(stderr, " %s [options]\n", program_invocation_short_name);
+    fprintf(stderr, " -s <seconds>\n");
+    exit(EXIT_FAILURE);
+}
+
+int main(int argc, char *argv[])
+{
+    int sleep_time, opt;
+    int shm_id;
+    void *shm_addr;
+
+    sleep_time = DEFAULT_SLEEPTIME;
+    while ((opt = getopt(argc, argv, "s:")) != -1)
+    { 
+        switch(opt)
+        {
+           case 's':
+            sleep_time = atoi(optarg);
+            if (sleep_time < 1)
+            {
+                fprintf(stderr, "sleep time must be 1 second or more\n");
+                usage();
+            }
+            break;
+        default:
+            usage();
+        }
+    }
+
+    /* get some shared memory */
+    if ( (shm_id = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666)) < 0)
+        xerr(EXIT_FAILURE, "Unable to shmget()");
+    if ( (shm_addr = shmat(shm_id, NULL, SHM_RDONLY)) < 0)
+        xerr(EXIT_FAILURE, "Unable to shmat()");
+    printf("SHMID: %llx\n", shm_id);
+    sleep(sleep_time);
+    return EXIT_SUCCESS;
+}
+
index 08c446f325600d2b724d1d9065b72261f2c54c36..a43dbaebfb6d9370072af56baf881028a22b0028 100644 (file)
@@ -186,6 +186,27 @@ proc make_testproc { } {
     set testproc2_pid [ exec $testproc_path & ]
 }
 
+proc make_testshm_proc { } {
+    global testshmproc_pid testshm_spawnid topdir shmid
+
+    set testshm_realpath "${topdir}/lib/test_shm"
+
+    set testshmproc_pid [ spawn $testshm_realpath ]
+    set testshmproc_spawnid $spawn_id
+    expect {
+       -i $testshmproc_spawnid
+       -re "^SHMID: (\\d+)" { set shmid $expect_out(1,string) }
+       default { fail "spawning testshm" }
+    }
+
+}
+
+proc kill_testshm_proc { } {
+    global testshmproc_pid
+
+    kill_process $testshmproc_pid
+}
+
 proc kill_testproc { } {
     global testproc_path testproc1_pid testproc2_pid
 
index 5a9e603c2e24437210deb11986365a32d36912b0..3b7e50efdc805ae1412deebe688fd92604fec2e2 100644 (file)
@@ -66,3 +66,8 @@ set test "pmap XX with unreachable process"
 spawn $pmap -XX 1
 expect_pass $test "$pmap_initname\$"
 
+set test "pmap finding shm"
+make_testshm_proc
+spawn $pmap $testshmproc_pid
+expect_pass $test "\[ shmid=0x$shmid \]"
+kill_testshm_proc