From 7856bf3569cc448fe3b360c3fca836593a0c0c7d Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Mon, 06 Nov 2023 17:01:27 +0800
Subject: [PATCH] format c source code

---
 ch6_ipc/semaphore.c |  100 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 93 insertions(+), 7 deletions(-)

diff --git a/ch6_ipc/semaphore.c b/ch6_ipc/semaphore.c
index 5b77416..b64987f 100644
--- a/ch6_ipc/semaphore.c
+++ b/ch6_ipc/semaphore.c
@@ -9,7 +9,7 @@
 #include <sys/sem.h>
 
 #define FTOK_PATH            "/dev/zero"
-#define FTOK_PROJID          0x666
+#define FTOK_PROJID          0x22
 
 union semun 
 {
@@ -18,18 +18,52 @@
     unsigned short *arry;
 };
 
+int semaphore_init(void);
+int semaphore_p(int semid);
+int semaphore_v(int semid);
+void semaphore_term(int semid);
+
 int main(int argc, char **argv)
 {
     int            semid;
+    pid_t          pid;
+    int            i;
 
-    if( (semid=init_set(1)) < 0)
+    if( (semid=semaphore_init()) < 0)
     {
-	
+	printf("semaphore initial failure: %s\n", strerror(errno)); 
+        return -1;
     }
 
+    if( (pid=fork()) < 0)
+    {
+        printf("fork() failure: %s\n", strerror(errno));
+        return -2;
+    }
+    else if( 0 == pid)  /* child process */
+    {
+        printf("Child process start running and do something now...\n");
+        sleep(3);
+        printf("Child process do something over...\n");
+        semaphore_v(semid);
+
+        sleep(1);
+
+        printf("Child process exit now\n");
+        exit(0);
+    }
+
+    printf("Parent process P operator wait child process over\n");
+    semaphore_p(semid);
+    printf("Parent start do something now...\n");
+    sleep(2);
+    printf("Perent process destroy semaphore and exit\n");
+
+    semaphore_term(semid);
+    return 0;
 }
 
-int init_set(int nums)
+int semaphore_init(void)
 {
     key_t          key;
     int            semid;
@@ -41,20 +75,72 @@
 	return -1;
     } 
     
-    semid = semget(key, nums, IPC_CREAT|IPC_EXCL|0644);
+    semid = semget(key, 1, IPC_CREAT|0644);
     if( semid < 0)
     {
 	printf("semget() get semid failure: %s\n", strerror(errno)); 
 	return -2;
     }
 
-
-    sem_union.val = 1;
+    sem_union.val = 0;
     if( semctl(semid, 0, SETVAL, sem_union)<0 )
     {
 	printf("semctl() set initial value failure: %s\n", strerror(errno)); 
 	return -3;
     }
 
+    printf("Semaphore get key_t[0x%x] and semid[%d]\n", key, semid);
+
     return semid;
 }
+
+void semaphore_term(int semid)
+{
+    union semun    sem_union;
+		    
+    if( semctl(semid, 0, IPC_RMID, sem_union)<0 )
+    {
+	printf("semctl() delete semaphore ID failure: %s\n", strerror(errno)); 
+    }
+
+    return ;
+}
+
+
+
+int semaphore_p(int semid)
+{
+    struct sembuf _sembuf;
+
+    _sembuf.sem_num = 0;
+    _sembuf.sem_op = -1;
+    _sembuf.sem_flg = SEM_UNDO; //  IPC_NOWAIT  SEM_UNDO
+
+
+    if( semop(semid, &_sembuf, 1) < 0 )
+    { 
+        printf("semop P operator failure: %s\n", strerror(errno));
+        return -1;
+    }
+
+    return 0;
+}
+
+int semaphore_v(int semid)
+{
+    struct sembuf _sembuf;
+
+    _sembuf.sem_num = 0;
+    _sembuf.sem_op = 1;
+    _sembuf.sem_flg = SEM_UNDO; //  IPC_NOWAIT  SEM_UNDO
+
+    if( semop(semid, &_sembuf, 1) < 0 )
+    { 
+        printf("semop V operator failure: %s\n", strerror(errno));
+        return -1;
+    }
+
+    return 0;
+}
+
+

--
Gitblit v1.9.1