1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| #include <sys/types.h>
| #include <sys/sem.h>
| #include <time.h>
| #include "usg_common.h"
|
| int
| main(int argc, char *argv[])
| {
| struct semid_ds ds;
| union semun arg, dummy; /* Fourth argument for semctl() */
| int semid, j;
|
| if (argc != 2 || strcmp(argv[1], "--help") == 0)
| err_exit(0, "%s semid\n", argv[0]);
|
| semid = atoi(argv[1]);
|
| arg.buf = &ds;
| if (semctl(semid, 0, IPC_STAT, arg) == -1)
| err_exit(errno, "semctl");
|
| printf("Semaphore changed: %s", ctime(&ds.sem_ctime));
| printf("Last semop(): %s", ctime(&ds.sem_otime));
|
| /* Display per-semaphore information */
|
| arg.array = (short unsigned int*)calloc(ds.sem_nsems, sizeof(arg.array[0]));
| if (arg.array == NULL)
| err_exit(errno, "calloc");
| if (semctl(semid, 0, GETALL, arg) == -1)
| err_exit(errno, "semctl-GETALL");
|
| printf("Sem # Value SEMPID SEMNCNT SEMZCNT\n");
|
| for (j = 0; j < ds.sem_nsems; j++)
| printf("%3d %5d %5d %5d %5d\n", j, arg.array[j],
| semctl(semid, j, GETPID, dummy),
| semctl(semid, j, GETNCNT, dummy),
| semctl(semid, j, GETZCNT, dummy));
|
| exit(EXIT_SUCCESS);
| }
|
|