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:
parent
1f085f5a9f
commit
9c5397a941
@ -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
1
lib/.gitignore
vendored
@ -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
69
lib/test_shm.c
Normal 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;
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user