zhangmeng
2024-01-18 d3d9b7341ef7613e0d2813b69491ffcef5736f48
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);
}