On Wed, 2017-12-06 at 23:56 +0100, Andreas Schwab wrote: > > On Dez 06 2017, Joakim Tjernlund <joakim.tjernl...@infinera.com> wrote: > > > st = semctl(sem, 0, IPC_STAT, &arg); > > This is not a valid use of IPC_STAT. The fourth argument must be a > object of type union semun (not a pointer), with the .buf member > pointing to the struct semid_ds object.
Ahh, so perl had it wrong (Any perl guys here?). This is what I came up with and it works: struct semid_ds arg; union semun { int val; /* Value for SETVAL */ struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ unsigned short *array; /* Array for GETALL, SETALL */ struct seminfo *__buf; /* Buffer for IPC_INFO (Linux-specific) */ } semopts = {0}; semopts.buf = &arg; #if defined(IPC_PRIVATE) && defined(S_IRWXU) && defined(S_IRWXG) && defined(S_IRWXO) && defined(IPC_CREAT) sem = semget(IPC_PRIVATE, 1, S_IRWXU|S_IRWXG|S_IRWXO|IPC_CREAT); if (sem > -1) { #ifdef IPC_STAT st = semctl(sem, 0, IPC_STAT, semopts); if (st == 0) printf("semid_ds\n"); else #endif /* IPC_STAT */ printf("semctl IPC_STAT failed: errno = %s\n", strerror(errno)); #ifdef IPC_RMID if (semctl(sem, 0, IPC_RMID, semopts) != 0) #endif /* IPC_RMID */ printf("semctl IPC_RMID failed: errno = %d\n", errno); } else #endif /* IPC_PRIVATE && ... */ printf("semget failed: errno = %d\n", errno); return 0; Jocke