testsuite: Add check for shared memory

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>
This commit is contained in:
Craig Small 2022-04-26 22:04:05 +10:00
parent 1f085f5a9f
commit 9c5397a941
5 changed files with 100 additions and 1 deletions

View File

@ -326,7 +326,8 @@ check_PROGRAMS = \
lib/test_strutils \ lib/test_strutils \
lib/test_fileutils \ lib/test_fileutils \
lib/test_process \ 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_SOURCES = lib/test_strutils.c lib/strutils.c
lib_test_strutils_LDADD = $(CYGWINFLAGS) lib_test_strutils_LDADD = $(CYGWINFLAGS)
@ -336,6 +337,8 @@ lib_test_process_SOURCES = lib/test_process.c
lib_test_process_LDADD = $(CYGWINFLAGS) lib_test_process_LDADD = $(CYGWINFLAGS)
lib_test_strtod_nol_SOURCES = lib/test_strtod_nol.c lib/strutils.c lib_test_strtod_nol_SOURCES = lib/test_strtod_nol.c lib/strutils.c
lib_test_strtod_nol_LDADD = $(CYGWINFLAGS) lib_test_strtod_nol_LDADD = $(CYGWINFLAGS)
lib_test_shm_SOURCES = lib/test_shm.c lib/strutils.c
lib_test_shm_LDADD = $(CYGWINFLAGS)
check_PROGRAMS += \ check_PROGRAMS += \
proc/test_Itemtables \ proc/test_Itemtables \

1
lib/.gitignore vendored
View File

@ -3,5 +3,6 @@
test_fileutils test_fileutils
test_nsutils test_nsutils
test_process test_process
test_shm
test_strutils test_strutils
test_strtod_nol test_strtod_nol

69
lib/test_shm.c Normal file
View File

@ -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;
}

View File

@ -186,6 +186,27 @@ proc make_testproc { } {
set testproc2_pid [ exec $testproc_path & ] 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 { } { proc kill_testproc { } {
global testproc_path testproc1_pid testproc2_pid global testproc_path testproc1_pid testproc2_pid

View File

@ -66,3 +66,8 @@ set test "pmap XX with unreachable process"
spawn $pmap -XX 1 spawn $pmap -XX 1
expect_pass $test "$pmap_initname\$" 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