From d7afb98ca2d9ed18400310f42d3f3c8177959280 Mon Sep 17 00:00:00 2001 From: Matthew Strapp Date: Mon, 26 Oct 2020 08:12:34 -0500 Subject: Do breakouts --- csci4061/092120_breakout/main.c | 6 +- csci4061/101220_breakout/exercise.c | 88 ++++++++++++++------- csci4061/102620_breakout/msg_queue_template.c | 107 ++++++++++++++++++++++++++ 3 files changed, 170 insertions(+), 31 deletions(-) create mode 100644 csci4061/102620_breakout/msg_queue_template.c diff --git a/csci4061/092120_breakout/main.c b/csci4061/092120_breakout/main.c index e5577dd..8d8e08d 100644 --- a/csci4061/092120_breakout/main.c +++ b/csci4061/092120_breakout/main.c @@ -26,8 +26,10 @@ int main(int argc, char **argv) { pid_t pid; for (int i=0; i #include #include +#include -int numOfEntries(char* path) { - int entries = 0; - while (readdir(path) != NULL) { - entries++; - } return entries; +int numOfEntry(char *path) +{ + int count = 0; + DIR *dir = opendir(path); + struct dirent *entry; + + while ((entry = readdir(dir)) != NULL) + { + + if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) + continue; + + count++; + } + + closedir(dir); + + return count; } -int main(int argc, char** argv){ - if (argc < 2) { +int main(int argc, char **argv) +{ + + if (argc < 2) + { printf("Pass the path as an argument to the program"); exit(1); } - char* path = argv[1]; - DIR* dir = opendir(path); - if(dir==NULL){ + char *path = argv[1]; + + DIR *dir = opendir(path); + if (dir == NULL) + { printf("The path passed is invalid"); return -1; } - struct dirent* entry; - DIR* current = dir; - -while ((entry = readdir(dir)) != NULL) { - if (entry->d_type == "DT_DIR"){ - printf("Directory: %s\n", entry->d_name); - printf(" Entries: %d\n", numOfEntries(entry)); - } else if (entry->d_type == "DT_REG") { - printf("Regular File: %s\n", entry->d_name); - printf(" Owner: %d\n"); - printf(" Size: %f\n"); - } else { - printf("%s\n", entry -> d_name); + struct dirent *entry; + + while ((entry = readdir(dir)) != NULL) + { + + if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) + continue; + + if (entry->d_type == DT_DIR) + { + char next[strlen(path) + strlen(entry->d_name) + 2]; + next[0] = '\0'; + strcat(next, path); + strcat(next, "/"); + strcat(next, entry->d_name); + printf("Directory: %s\n\tEntries: %d\n", entry->d_name, numOfEntry(next)); } - } - /* - Iterate through the elements in argv[1] - Refer the ls example in slides if you have any doubts - */ - + else if (entry->d_type == DT_REG) + { + struct stat *buf = (struct stat *)malloc(sizeof(struct stat)); + stat(entry->d_name, buf); + printf("Regular File: %s\n\tOwner: %d\n\tSize: %f\n\tInode: %llu\n", + entry->d_name, buf->st_uid, (double)buf->st_size, buf->st_ino); + free(buf); + } + else + { + printf("File: %s\n\tType:%hhu\n", entry->d_name, entry->d_type); + } + } + closedir(dir); return 0; } \ No newline at end of file diff --git a/csci4061/102620_breakout/msg_queue_template.c b/csci4061/102620_breakout/msg_queue_template.c new file mode 100644 index 0000000..676291e --- /dev/null +++ b/csci4061/102620_breakout/msg_queue_template.c @@ -0,0 +1,107 @@ +/* +* Recitation Section Number: +* Breakout Number: +* Member Name (X500) +* Member Name (X500) +* Member Name (X500) +* Member Name (X500) +*/ + +#include +#include +#include +#include +#include +#include + +#define PERM 0666 +#define MSGSIZE 100 +#define NCHILD 3 + +// structure for message queue +typedef struct msg_buffer { + long mtype; + char mtext[MSGSIZE]; +} message; + +int main(void) { + key_t key; + int msgid; + pid_t pid1, pid2; + message msg; + + // generate unique key + key = ftok("recitation", 4061); + + // creates a message queue + msgid = msgget(key, PERM | IPC_CREAT); + + + // sender child process + pid1 = fork(); + if (pid1 == 0) { + for (int i = 0; i < NCHILD; i++) { + msg.mtype = 111; + memset(msg.mtext, '\0', MSGSIZE); + sprintf(msg.mtext, "Hello child %d", i); + // send message to other child processes + msgsnd(msgid, &msg, MSGSIZE, 0); + + + // display the message + printf("[%d] Data sent is : %s \n", i, msg.mtext); + } + + for (int i = 0; i < NCHILD; i++) { + msg.mtype = 222; + memset(msg.mtext, '\0', MSGSIZE); + sprintf(msg.mtext, "Message %d", i); + // send message to other child processes + msgsnd(msgid, &msg, MSGSIZE, 0); + + // display the message + printf("[%d] Data sent is : %s \n", i, msg.mtext); + } + + for (int i = 0; i < NCHILD; i++) { + msg.mtype = 333; + memset(msg.mtext, '\0', MSGSIZE); + sprintf(msg.mtext, "Bye %d", i); + // send message to other child processes + msgsnd(msgid, &msg, MSGSIZE, 0); + + // display the message + printf("[%d] Data sent is : %s \n", i, msg.mtext); + } + + exit(0); + } else if (pid1 < 0) { + printf("fork1 error\n"); + return -1; + } + + // receiver child processes + for (int j = 0; j < NCHILD; j++) { + if ((pid2 = fork()) == 0) { + // receive message + msgrcv(msgid, &msg, MSGSIZE, +222, 0); + + + // display the message + printf("[%d] Data received is : %s \n", j, msg.mtext); + + exit(0); + } else if (pid2 < 0) { + printf("fork2 error\n"); + return -1; + } + } + + while (wait(NULL) > 0); + + // to destroy the message queue + msgctl(msgid, IPC_RMID, NULL); + + + return 0; +} \ No newline at end of file -- cgit v1.2.3