#include #include #include #include #include int sfork(); int forkFib(int fibNumber); int *threadFib(int *fibNumber); int main(int argc, char **argv){ int fibNumber; int fibResult; int threadResult = 0; int test; char type; if (argc > 3 || argc < 3){ printf("Usage: fibFork type fibLength\n"); printf(" type = f or t (fork or threaded)\n"); printf(" fibLength = integer value\n"); return 1; } if (sscanf(argv[2], "%d", &test) == 0){ printf("Usage: fibFork type fibLength\n"); printf(" type = f or t (forked or threaded)\n"); printf(" fibLength = integer value\n"); return 1; } if (strlen(argv[1]) > 1){ printf("type must be a single character!\n"); exit(1); } sscanf(argv[1], "%c", &type); sscanf(argv[2], "%d", &fibNumber); if (type == 't'){ threadResult = *threadFib(&fibNumber); printf("FibThread = %d\n", threadResult); }else if (type == 'f'){ fibResult = forkFib(fibNumber); printf("FIBFINAL: %d\n", fibResult); }else{ printf("Type must be f or t\n"); exit(1); } printf("DONE\n"); return 0; } int sfork(){ int pid; pid = fork(); if (pid == -1){ perror("Fork error"); exit(1); }else return pid; } int forkFib(int fibNumber){ int pid1 = 0, pid2 = 0; int status1, status2; if(fibNumber == 0) return 0; else if (fibNumber == 1 || fibNumber == 2) return 1; else{ if((pid1=sfork()) == 0){ exit(forkFib(fibNumber-1)); } if((pid2=sfork()) == 0){ exit(forkFib(fibNumber-2)); } waitpid(pid1, &status1, 0); waitpid(pid2, &status2, 0); return (WEXITSTATUS(status1) + WEXITSTATUS(status2)); } } int *threadFib(int *fibNumber){ printf("FIB NUMBER: %d\n", *fibNumber); pthread_t thread1, thread2; int num1,num2; int retVal1, retVal2; int *returnVal1, *returnVal2; int *x; num1 = 0; num2 = 0; retVal1 = 0; retVal2 = 0; if (*fibNumber == 0){ return (int*)0; }else if (*fibNumber == 1 || *fibNumber == 2){ return (int*)1; }else{ num1 = *fibNumber - 1; num2 = *fibNumber - 2; printf("FIB1: %d FIB2: %d\n", num1, num2); if((pthread_create(&thread1, NULL, (void*)threadFib, &num1)) != 0){ perror("Thread 1"); exit(1); } if((pthread_create(&thread2, NULL, (void*)threadFib, &num2)) != 0){ perror("Thread 2"); exit(1); } pthread_join(thread1, (void**)&returnVal1); printf("THREAD1 Joined\n"); pthread_join(thread2, (void**)&returnVal2); printf("THREAD2 Joined\n"); printf("RETVAL1: %d\nRETVAL2: %d\n", returnVal1, returnVal2); printf("AFTERTHREADS\n"); *x = (int)returnVal1 + (int)returnVal2; printf("BLAH\n"); } printf("X = %d\n", *x); return x; }