1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 #include <sys/wait.h> 30 #include <stdlib.h> 31 #include <unistd.h> 32 #include <stdio.h> 33 34 int main(int argc, char *argv[]) { 35 36 pid_t cpid; 37 int status; 38 struct rusage usage; 39 40 //---------------------------------------------------- 41 //----------------- Wait(); System Call -------------- 42 //---------------------------------------------------- 43 printf("Testing Wait(); System Call\n"); 44 printf("\n"); 45 46 cpid = fork(); /* Creates fork */ 47 if (cpid == -1) { 48 printf("For has failed, returned = %d\n", EXIT_FAILURE); 49 } 50 51 if (cpid == 0) { /* This is the child operation */ 52 printf("Child Created\n"); 53 printf("Child = %d\n", getpid()); 54 printf("Parent = %d\n", getppid()); 55 sleep(2); 56 exit(3); 57 58 } else { /* This is the parent operation */ 59 printf("Waiting for child\n"); 60 wait(&status); 61 printf("Waiting Complete\n"); 62 printf("Child Exit Code: %d\n", WEXITSTATUS(status)); 63 } 64 65 printf("\n"); /* Just console space */ 66 //---------------------------------------------------- 67 //-------------- Waitpid(); System Call -------------- 68 //---------------------------------------------------- 69 printf("Testing Waitpid(); System Call\n"); 70 printf("\n"); 71 72 73 cpid = fork(); /* Creates fork */ 74 if (cpid == -1) { 75 printf("Fork has failed, returned = %d\n", EXIT_FAILURE); 76 } 77 78 if (cpid == 0) { /* This is the child operation */ 79 printf("Child Created\n"); 80 printf("Child = %d\n", getpid()); 81 printf("Parent = %d\n", getppid()); 82 sleep(2); 83 exit(3); 84 85 } else { /* This is the parent operation */ 86 printf("Waiting for child %d\n", cpid); 87 waitpid(cpid, NULL, 0); 88 printf("Waiting Complete\n"); 89 printf("Child Exit Code: %d\n", WEXITSTATUS(status)); 90 } 91 92 printf("\n"); 93 //---------------------------------------------------- 94 //---------------- Wait3(); System Call -------------- 95 //---------------------------------------------------- 96 printf("Testing Wait3(); System Call\n"); 97 printf("\n"); 98 99 cpid = fork(); /* Creates fork */ 100 if (cpid == -1) { 101 printf("For has failed, returned = %d\n", EXIT_FAILURE); 102 } 103 104 if (cpid == 0) { /* This is the child operation */ 105 printf("Child Created\n"); 106 printf("Child = %d\n", getpid()); 107 printf("Parent = %d\n", getppid()); 108 sleep(2); 109 exit(3); 110 111 } else { /* This is the parent operation */ 112 printf("Waiting for child\n"); 113 wait3(&status, 0, &usage); 114 printf("Waiting Complete\n"); 115 printf("Child Exit Code: %d\n", WEXITSTATUS(status)); 116 } 117 118 printf("\n"); 119 sleep(1); 120 //---------------------------------------------------- 121 //---------------- Wait4(); System Call -------------- 122 //---------------------------------------------------- 123 printf("Testing Wait4(); System Call\n"); 124 printf("\n"); 125 126 cpid = fork(); /* Creates fork */ 127 if (cpid == -1) { 128 printf("For has failed, returned = %d\n", EXIT_FAILURE); 129 } 130 131 if (cpid == 0) { /* This is the child operation */ 132 printf("Child Created\n"); 133 printf("Child = %d\n", getpid()); 134 printf("Parent = %d\n", getppid()); 135 sleep(2); 136 exit(3); 137 138 } else { /* This is the parent operation */ 139 printf("Waiting for child\n"); 140 wait4(cpid, &status, 0, &usage); 141 //__wait4(cpid, &status, 0, &usage); // This function will work, the above which is delcared will not. 142 printf("Waiting Complete\n"); 143 printf("Child Exit Code: %d\n", WEXITSTATUS(status)); 144 } 145 146 printf("\n"); 147 sleep(1); 148 149 return EXIT_SUCCESS; 150 151 } 152 153