[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