[uClibc] Re: shm funkiness
David Wuertele
dave-gnus at bfnet.com
Fri Aug 1 01:51:28 UTC 2003
Not to make this conversation too one-sided, but I have improved my
test program to demonstrate just how broken shm is on my system. The
program, "dave.cpp", is included below my signature. The behavior on
my RH9.0 development system is as follows:
# ./dave 1234
id = 1776222214
shm_perm.uid = 0
shm_perm.gid = 0
shm_perm.cuid = 0
shm_perm.cgid = 0
shm_perm.mode = 0
shm_segsz = 4096
shm_lpid = 0
shm_cpid = 2690
shm_nattch = 0
shm_atime = Not Set
shm_dtime = Not Set
shm_ctime = Thu Jul 31 18:37:59 2003
Mapping... shm_perm.uid = 0
shm_perm.gid = 0
shm_perm.cuid = 0
shm_perm.cgid = 0
shm_perm.mode = 0
shm_segsz = 4096
shm_lpid = 2690
shm_cpid = 2690
shm_nattch = 1
shm_atime = Thu Jul 31 18:38:28 2003
shm_dtime = Not Set
shm_ctime = Thu Jul 31 18:37:59 2003
Unmapping... shm_perm.uid = 0
shm_perm.gid = 0
shm_perm.cuid = 0
shm_perm.cgid = 0
shm_perm.mode = 0
shm_segsz = 4096
shm_lpid = 2690
shm_cpid = 2690
shm_nattch = 1
shm_atime = Thu Jul 31 18:38:33 2003
shm_dtime = Thu Jul 31 18:38:36 2003
shm_ctime = Thu Jul 31 18:37:59 2003
#
This looks fine to me. The output from ipcs on my RH system also
looks fine. But on my embedded uClibc system, I get what appears to
be random numbers in some of the shmid_ds fields:
# dave 2345
id = 32769
shm_perm.uid = 0
shm_perm.gid = 0
shm_perm.cuid = 0
shm_perm.cgid = 0
shm_perm.mode = 0
shm_segsz = 0
shm_lpid = -2146102704
shm_cpid = -2146238464
shm_nattch = 718327808
shm_atime = Fri Dec 31 17:02:00 1999
shm_dtime = Wed Dec 31 17:01:03 1969
shm_ctime = Wed Dec 31 17:00:00 1969
Mapping... shm_perm.uid = 0
shm_perm.gid = 0
shm_perm.cuid = 0
shm_perm.cgid = 0
shm_perm.mode = 0
shm_segsz = 0
shm_lpid = -2123924864
shm_cpid = -2123235327
shm_nattch = -2121486784
shm_atime = Fri Dec 31 17:02:00 1999
shm_dtime = Wed Dec 31 17:01:03 1969
shm_ctime = Wed Dec 31 17:01:03 1969
Unmapping... shm_perm.uid = 0
shm_perm.gid = 0
shm_perm.cuid = 0
shm_perm.cgid = 0
shm_perm.mode = 0
shm_segsz = 946685164
shm_lpid = 63488
shm_cpid = -2146303999
shm_nattch = -2114820576
shm_atime = Fri Dec 31 17:02:00 1999
shm_dtime = Wed Dec 31 17:01:03 1969
shm_ctime = Wed Dec 31 17:01:03 1969
#
What gives? Has anybody used System V IPC on uClibc? I must be doing
something wrong. Any hints?
Thanks,
Dave
/* dave.cpp: demonstrate simple shmget/shmat functionality */
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <time.h>
int
main(int ac, char **av)
{
key_t key = atoi(av[1]);
int id = shmget (key, 0x1000, IPC_CREAT);
fprintf (stderr, "id = %d\n", id);
struct shmid_ds shmid_ds;
register int retval = shmctl(id, IPC_STAT, &shmid_ds);
if (retval == -1) {
perror ("shmctl: shmctl failed");
return 1;
} else {
fprintf (stderr, "\tshm_perm.uid = %d\n", shmid_ds.shm_perm.uid);
fprintf (stderr, "\tshm_perm.gid = %d\n", shmid_ds.shm_perm.gid);
fprintf (stderr, "\tshm_perm.cuid = %d\n", shmid_ds.shm_perm.cuid);
fprintf (stderr, "\tshm_perm.cgid = %d\n", shmid_ds.shm_perm.cgid);
fprintf (stderr, "\tshm_perm.mode = %#o\n", shmid_ds.shm_perm.mode);
fprintf (stderr, "\tshm_segsz = %d\n", shmid_ds.shm_segsz);
fprintf (stderr, "\tshm_lpid = %d\n", shmid_ds.shm_lpid);
fprintf (stderr, "\tshm_cpid = %d\n", shmid_ds.shm_cpid);
fprintf (stderr, "\tshm_nattch = %d\n", shmid_ds.shm_nattch);
fprintf (stderr, "\tshm_atime = %s", shmid_ds.shm_atime ? ctime(&shmid_ds.shm_atime) : "Not Set\n");
fprintf (stderr, "\tshm_dtime = %s", shmid_ds.shm_dtime ? ctime(&shmid_ds.shm_dtime) : "Not Set\n");
fprintf (stderr, "\tshm_ctime = %s", ctime(&shmid_ds.shm_ctime));
}
getc(stdin);
fprintf (stderr, "Mapping...");
void *myptr = shmat (id, NULL, 0);
if (myptr == (void *)-1) {
perror ("shmat: shmat failed");
return 1;
}
retval = shmctl(id, IPC_STAT, &shmid_ds);
if (retval == -1) {
perror ("shmctl: shmctl failed");
return 1;
} else {
fprintf (stderr, "\tshm_perm.uid = %d\n", shmid_ds.shm_perm.uid);
fprintf (stderr, "\tshm_perm.gid = %d\n", shmid_ds.shm_perm.gid);
fprintf (stderr, "\tshm_perm.cuid = %d\n", shmid_ds.shm_perm.cuid);
fprintf (stderr, "\tshm_perm.cgid = %d\n", shmid_ds.shm_perm.cgid);
fprintf (stderr, "\tshm_perm.mode = %#o\n", shmid_ds.shm_perm.mode);
fprintf (stderr, "\tshm_segsz = %d\n", shmid_ds.shm_segsz);
fprintf (stderr, "\tshm_lpid = %d\n", shmid_ds.shm_lpid);
fprintf (stderr, "\tshm_cpid = %d\n", shmid_ds.shm_cpid);
fprintf (stderr, "\tshm_nattch = %d\n", shmid_ds.shm_nattch);
fprintf (stderr, "\tshm_atime = %s", shmid_ds.shm_atime ? ctime(&shmid_ds.shm_atime) : "Not Set\n");
fprintf (stderr, "\tshm_dtime = %s", shmid_ds.shm_dtime ? ctime(&shmid_ds.shm_dtime) : "Not Set\n");
fprintf (stderr, "\tshm_ctime = %s", ctime(&shmid_ds.shm_ctime));
}
getc(stdin);
fprintf (stderr, "Unmapping...");
shmdt (myptr);
retval = shmctl(id, IPC_STAT, &shmid_ds);
if (retval == -1) {
perror ("shmctl: shmctl failed");
return 1;
} else {
fprintf (stderr, "\tshm_perm.uid = %d\n", shmid_ds.shm_perm.uid);
fprintf (stderr, "\tshm_perm.gid = %d\n", shmid_ds.shm_perm.gid);
fprintf (stderr, "\tshm_perm.cuid = %d\n", shmid_ds.shm_perm.cuid);
fprintf (stderr, "\tshm_perm.cgid = %d\n", shmid_ds.shm_perm.cgid);
fprintf (stderr, "\tshm_perm.mode = %#o\n", shmid_ds.shm_perm.mode);
fprintf (stderr, "\tshm_segsz = %d\n", shmid_ds.shm_segsz);
fprintf (stderr, "\tshm_lpid = %d\n", shmid_ds.shm_lpid);
fprintf (stderr, "\tshm_cpid = %d\n", shmid_ds.shm_cpid);
fprintf (stderr, "\tshm_nattch = %d\n", shmid_ds.shm_nattch);
fprintf (stderr, "\tshm_atime = %s", shmid_ds.shm_atime ? ctime(&shmid_ds.shm_atime) : "Not Set\n");
fprintf (stderr, "\tshm_dtime = %s", shmid_ds.shm_dtime ? ctime(&shmid_ds.shm_dtime) : "Not Set\n");
fprintf (stderr, "\tshm_ctime = %s", ctime(&shmid_ds.shm_ctime));
}
getc(stdin);
return 0;
}
More information about the uClibc
mailing list