diff --git a/Makefile.am b/Makefile.am index 4059e130..862a990a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 \ diff --git a/lib/.gitignore b/lib/.gitignore index 7eb5747e..8d6947f1 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -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 index 00000000..7643f7fe --- /dev/null +++ b/lib/test_shm.c @@ -0,0 +1,69 @@ +/* + * test_shm -- program to create a shared memory segment for testing + * + * Copyright 2022 Craig Small + * + * 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 +#include +#include +#include +#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 \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; +} + diff --git a/testsuite/config/unix.exp b/testsuite/config/unix.exp index 08c446f3..a43dbaeb 100644 --- a/testsuite/config/unix.exp +++ b/testsuite/config/unix.exp @@ -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 diff --git a/testsuite/pmap.test/pmap.exp b/testsuite/pmap.test/pmap.exp index 5a9e603c..3b7e50ef 100644 --- a/testsuite/pmap.test/pmap.exp +++ b/testsuite/pmap.test/pmap.exp @@ -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