diff --git a/ex2/T3.c b/ex2/T3.c index a8a154e70d7bd8da4578c8c4c659d1f2fecff4e9..0d03106c6e048ff8409d4576b6a69a060006d1c5 100644 --- a/ex2/T3.c +++ b/ex2/T3.c @@ -5,8 +5,61 @@ #include <sys/types.h> #include <sys/wait.h> +void* runner(void* pid) { + printf("My TID is: %ld\nMy PID is: %d\n", pthread_self(), *((int*) pid)); + pthread_exit(0); +} + +pthread_t thread_gen(int* pid) { + pthread_t tid; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_create(&tid, &attr, runner, (void*) pid); + return tid; +} + int main() { - // TODO: Fork multiple processes here - // TODO: Each process with a different number of threads - // TODO: Each thread should print the PID and TID + int cpid1, cpid2; + switch (cpid1 = fork()) { + case -1 : + perror("error"); + exit(EXIT_FAILURE); + case 0 : + // Child process: + pthread_t tid1, tid2; + tid1 = thread_gen(&cpid1); + tid2 = thread_gen(&cpid1); + pthread_join(tid1, NULL); + pthread_join(tid2, NULL); + exit(0); + default : + // Parent process: + int status; + if (wait(&status) == -1) { + perror("error"); + } + } + switch (cpid2 = fork()) { + case -1 : + perror("error"); + exit(EXIT_FAILURE); + case 0 : + // Child process: + pthread_t tid1, tid2, tid3; + tid1 = thread_gen(&cpid2); + tid2 = thread_gen(&cpid2); + tid3 = thread_gen(&cpid2); + pthread_join(tid1, NULL); + pthread_join(tid2, NULL); + pthread_join(tid3, NULL); + exit(0); + default : + // Parent process: + int status; + if (wait(&status) == -1) { + perror("error"); + } + } + + return 0; } \ No newline at end of file