tst-semctl.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/ipc.h>
  5. #include <sys/sem.h>
  6. #include <time.h>
  7. #include <unistd.h>
  8. union semun {
  9. int val;
  10. struct semid_ds *buf;
  11. unsigned short *array;
  12. };
  13. struct timespec ts = {
  14. .tv_sec = 3468960000, // 3468960000 2075-12-05 Destination timestamp
  15. .tv_nsec = 0
  16. };
  17. void print_semid_ds(struct semid_ds *ds) {
  18. printf("sem_perm.uid: %d\n", ds->sem_perm.uid);
  19. printf("sem_perm.gid: %d\n", ds->sem_perm.gid);
  20. printf("sem_perm.cuid: %d\n", ds->sem_perm.cuid);
  21. printf("sem_perm.cgid: %d\n", ds->sem_perm.cgid);
  22. printf("sem_perm.mode: %o\n", ds->sem_perm.mode);
  23. printf("sem_nsems: %d\n", ds->sem_nsems);
  24. printf("sem_otime: %s", ctime(&ds->sem_otime));
  25. printf("sem_ctime: %s \n", ctime(&ds->sem_ctime));
  26. }
  27. int main() {
  28. int semid;
  29. union semun arg;
  30. struct semid_ds ds;
  31. if (clock_settime(CLOCK_REALTIME, &ts) == -1) { // Set the time to after 2038
  32. perror("Error setting time");
  33. return 1;
  34. }
  35. // Create a semaphore set
  36. if ((semid = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT)) == -1) {
  37. perror("semget failed");
  38. exit(1);
  39. }
  40. // Get the semid_ds structure
  41. arg.buf = &ds;
  42. if (semctl(semid, 0, IPC_STAT, arg) == -1) {
  43. perror("semctl IPC_STAT failed");
  44. exit(1);
  45. }
  46. // Print the structure contents
  47. printf("=== semid_ds structure values ===\n");
  48. print_semid_ds(&ds);
  49. // Change permissions
  50. ds.sem_perm.mode = 0600; // Change to new permissions
  51. if (semctl(semid, 0, IPC_SET, arg) == -1) {
  52. perror("semctl IPC_SET failed");
  53. semctl(semid, 0, IPC_RMID);
  54. exit(EXIT_FAILURE);
  55. }
  56. // Print the structure contents
  57. printf("=== semid_ds structure values ===\n");
  58. print_semid_ds(&ds);
  59. if ((ds.sem_ctime - ts.tv_sec > 60) || (ts.tv_sec - ds.sem_ctime > 60)) {
  60. printf("\nSemctl get a error time! \n");
  61. exit(EXIT_FAILURE);
  62. }
  63. // Delete a semaphore
  64. if (semctl(semid, 0, IPC_RMID) == -1) {
  65. perror("semctl IPC_RMID failed");
  66. exit(1);
  67. }
  68. return 0;
  69. }