tst-semctl.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. struct timespec ts_init, ts_final;
  32. // Save system time
  33. if (clock_gettime(CLOCK_REALTIME, &ts_init) == -1) {
  34. perror("Error getting time");
  35. return 1;
  36. }
  37. if (clock_settime(CLOCK_REALTIME, &ts) == -1) { // Set the time to after 2038
  38. perror("Error setting time");
  39. return 1;
  40. }
  41. // Create a semaphore set
  42. if ((semid = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT)) == -1) {
  43. perror("semget failed");
  44. exit(1);
  45. }
  46. // Get the semid_ds structure
  47. arg.buf = &ds;
  48. if (semctl(semid, 0, IPC_STAT, arg) == -1) {
  49. perror("semctl IPC_STAT failed");
  50. exit(1);
  51. }
  52. // Print the structure contents
  53. printf("=== semid_ds structure values ===\n");
  54. print_semid_ds(&ds);
  55. // Change permissions
  56. ds.sem_perm.mode = 0600; // Change to new permissions
  57. if (semctl(semid, 0, IPC_SET, arg) == -1) {
  58. perror("semctl IPC_SET failed");
  59. semctl(semid, 0, IPC_RMID);
  60. exit(EXIT_FAILURE);
  61. }
  62. // Print the structure contents
  63. printf("=== semid_ds structure values ===\n");
  64. print_semid_ds(&ds);
  65. if ((ds.sem_ctime - ts.tv_sec > 60) || (ts.tv_sec - ds.sem_ctime > 60)) {
  66. printf("\nSemctl get a error time! \n");
  67. exit(EXIT_FAILURE);
  68. }
  69. // Delete a semaphore
  70. if (semctl(semid, 0, IPC_RMID) == -1) {
  71. perror("semctl IPC_RMID failed");
  72. exit(1);
  73. }
  74. // Restore system time
  75. clock_gettime(CLOCK_REALTIME, &ts_final);
  76. ts_init.tv_sec = ts_init.tv_sec + ts_final.tv_sec - ts.tv_sec;
  77. clock_settime(CLOCK_REALTIME, &ts_init);
  78. return 0;
  79. }