1 /* 2 * Copyright (c) 2002, Intel Corporation. All rights reserved. 3 * Created by: crystal.xiong REMOVE-THIS AT intel DOT com 4 * This file is licensed under the GPL license. For the full content 5 * of this license, see the COPYING file at the top level of this 6 * source tree. 7 * 8 * This test use semaphore to protect critical section between several 9 * processes. 10 */ 11 #include <stdio.h> 12 #include <unistd.h> 13 #include <fcntl.h> 14 #include <stdlib.h> 15 #include <sys/wait.h> 16 #include <sys/mman.h> 17 #include <string.h> 18 #include <errno.h> 19 #include <semaphore.h> 20 21 #include "posixtest.h" 22 23 #define SEM_NAME "/tmp/semaphore" 24 #define BUF_SIZE 200 25 #define DEFAULT_THREADS 5 26 27 int main(int argc, char *argv[]) 28 { 29 sem_t *sem_lock; 30 int shared = 1; 31 int value = 1; 32 pid_t pid = 0; 33 int i, num = 0; 34 char buf[BUF_SIZE]; 35 char *c; 36 37 #ifndef _POSIX_SEMAPHORES 38 printf("_POSIX_SEMAPHORES is not defined \n"); 39 return PTS_UNRESOLVED; 40 #endif 41 if ((2 != argc) || ((num = atoi(argv[1])) <= 0)) { 42 printf("Setting num_of_processes to default value: %d\n", 43 DEFAULT_THREADS); 44 num = DEFAULT_THREADS; 45 } 46 if ((sem_lock = malloc(sizeof(sem_t))) == NULL) { 47 perror("malloc"); 48 return PTS_UNRESOLVED; 49 } 50 if (sem_init(sem_lock, shared, value) == -1) { 51 perror("sem_init didn't return success\n"); 52 return PTS_UNRESOLVED; 53 } 54 for (i = 1; i < num; i++) 55 switch ((pid = fork())) { 56 case -1: 57 perror("fork"); 58 return PTS_UNRESOLVED; 59 case 0: 60 break; 61 default: 62 sleep(2); 63 break; 64 } 65 66 sprintf(buf, "%d process_ID: %ld parent_process_ID: %ld " 67 "child_process_ID: %ld\n", i, (long)getpid(), 68 (long)getppid(), (long)pid); 69 70 if (sem_wait(sem_lock) == -1) { 71 perror("sem_wait didn't return success\n"); 72 return PTS_UNRESOLVED; 73 } 74 for (i = 1; i <= 10; i++) { 75 c = buf; 76 while (*c != '\n') { 77 fputc(*c, stdout); 78 c++; 79 } 80 fputc('\n', stdout); 81 } 82 83 if (sem_post(sem_lock) == -1) { 84 perror("sem_wait didn't return success\n"); 85 return PTS_UNRESOLVED; 86 } 87 88 return PTS_PASS; 89 } 90