Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CS2OS - Coursework

Part 1: Containers, scripting and UNIX CLIs: The container provided for this assessment uses the bash shell, and includes an executable named “trial”. Write a “for” loop in bash script that runs the program “trial” 20 times and sends its output to a differently named file each time. Have the script name the output files output NN.txt, where NN is 01,02,...,20 [10 marks], and also print out the name of the current file so the user can see the progress of the script.

Part 2: Programming Linux with C: Write a program that copies the first 256 bytes from the file “input.txt” to the file “output.txt”, using the Linux system call interface. The syscall() function is the lowest level of function generally available through the kernel API. Above this, there are its wrapper functions, e.g. open(), read(), and so on. Your task is to implement the file copy using both syscall() and the wrappers. Your code should determine which method to use based on the value of the first command-line argument given to your program; if ‘s’ then use syscall() and if ‘w’ then use the wrapper functions.

Part 3: Synchronisation and threads: The final section is a version of the “producer–consumer problem”. The program creates a variable number of threads (2 ≤ N < 1024) based on command-line parameters, and threads either produce or consume data. They share a circular buffer to communicate these data to each other. If there are many producers, the buffer fills up and the producers have to wait to insert data. Conversely, if there are many consumers, the buffer can become empty and the consumers have to wait. If access to the buffer is not properly synchronised, data can be lost. Your task is to take the given source code file “prod-com.c” and fill in the sections marked TODO (the functions insert item and remove item), to make the program work effectively. The necessary variables for the semaphores and mutex are already provided and initialised in the sample code: empty and full semaphores which count the number of empty and full slots in the buffer, and mutex, which is a binary semaphore that protects the actual insertion and removal of items in the buffer. Hint: this problem is taken from the Silberschatz text book, at the end of Chapter 6. You will need to use pointers, so make sure you are clear about how pointers are written in C, how “pointer arithmetic” works to move through sequential items in memory, and how to “dereference” a pointer to access or write to the memory location that it points to. Note that you must access the buffer using pointer dereferencing, not using array indexing (i.e. without using the buffer[i] syntax). See Figure 1 for the example output of a correct solution.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CS2OS - Coursework

Part 1: Containers, scripting and UNIX CLIs: The container provided for this assessment uses the bash shell, and includes an executable named “trial”. Write a “for” loop in bash script that runs the program “trial” 20 times and sends its output to a differently named file each time. Have the script name the output files output NN.txt, where NN is 01,02,...,20 [10 marks], and also print out the name of the current file so the user can see the progress of the script.

Part 2: Programming Linux with C: Write a program that copies the first 256 bytes from the file “input.txt” to the file “output.txt”, using the Linux system call interface. The syscall() function is the lowest level of function generally available through the kernel API. Above this, there are its wrapper functions, e.g. open(), read(), and so on. Your task is to implement the file copy using both syscall() and the wrappers. Your code should determine which method to use based on the value of the first command-line argument given to your program; if ‘s’ then use syscall() and if ‘w’ then use the wrapper functions.

Part 3: Synchronisation and threads: The final section is a version of the “producer–consumer problem”. The program creates a variable number of threads (2 ≤ N < 1024) based on command-line parameters, and threads either produce or consume data. They share a circular buffer to communicate these data to each other. If there are many producers, the buffer fills up and the producers have to wait to insert data. Conversely, if there are many consumers, the buffer can become empty and the consumers have to wait. If access to the buffer is not properly synchronised, data can be lost. Your task is to take the given source code file “prod-com.c” and fill in the sections marked TODO (the functions insert item and remove item), to make the program work effectively. The necessary variables for the semaphores and mutex are already provided and initialised in the sample code: empty and full semaphores which count the number of empty and full slots in the buffer, and mutex, which is a binary semaphore that protects the actual insertion and removal of items in the buffer. Hint: this problem is taken from the Silberschatz text book, at the end of Chapter 6. You will need to use pointers, so make sure you are clear about how pointers are written in C, how “pointer arithmetic” works to move through sequential items in memory, and how to “dereference” a pointer to access or write to the memory location that it points to. Note that you must access the buffer using pointer dereferencing, not using array indexing (i.e. without using the buffer[i] syntax). See Figure 1 for the example output of a correct solution.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CS2OS - Coursework

Part 1: Containers, scripting and UNIX CLIs: The container provided for this assessment uses the bash shell, and includes an executable named “trial”. Write a “for” loop in bash script that runs the program “trial” 20 times and sends its output to a differently named file each time. Have the script name the output files output NN.txt, where NN is 01,02,...,20 [10 marks], and also print out the name of the current file so the user can see the progress of the script.

Part 2: Programming Linux with C: Write a program that copies the first 256 bytes from the file “input.txt” to the file “output.txt”, using the Linux system call interface. The syscall() function is the lowest level of function generally available through the kernel API. Above this, there are its wrapper functions, e.g. open(), read(), and so on. Your task is to implement the file copy using both syscall() and the wrappers. Your code should determine which method to use based on the value of the first command-line argument given to your program; if ‘s’ then use syscall() and if ‘w’ then use the wrapper functions.

Part 3: Synchronisation and threads: The final section is a version of the “producer–consumer problem”. The program creates a variable number of threads (2 ≤ N < 1024) based on command-line parameters, and threads either produce or consume data. They share a circular buffer to communicate these data to each other. If there are many producers, the buffer fills up and the producers have to wait to insert data. Conversely, if there are many consumers, the buffer can become empty and the consumers have to wait. If access to the buffer is not properly synchronised, data can be lost. Your task is to take the given source code file “prod-com.c” and fill in the sections marked TODO (the functions insert item and remove item), to make the program work effectively. The necessary variables for the semaphores and mutex are already provided and initialised in the sample code: empty and full semaphores which count the number of empty and full slots in the buffer, and mutex, which is a binary semaphore that protects the actual insertion and removal of items in the buffer. Hint: this problem is taken from the Silberschatz text book, at the end of Chapter 6. You will need to use pointers, so make sure you are clear about how pointers are written in C, how “pointer arithmetic” works to move through sequential items in memory, and how to “dereference” a pointer to access or write to the memory location that it points to. Note that you must access the buffer using pointer dereferencing, not using array indexing (i.e. without using the buffer[i] syntax). See Figure 1 for the example output of a correct solution.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CS2OS - Coursework

Part 1: Containers, scripting and UNIX CLIs: The container provided for this assessment uses the bash shell, and includes an executable named “trial”. Write a “for” loop in bash script that runs the program “trial” 20 times and sends its output to a differently named file each time. Have the script name the output files output NN.txt, where NN is 01,02,...,20 [10 marks], and also print out the name of the current file so the user can see the progress of the script.

Part 2: Programming Linux with C: Write a program that copies the first 256 bytes from the file “input.txt” to the file “output.txt”, using the Linux system call interface. The syscall() function is the lowest level of function generally available through the kernel API. Above this, there are its wrapper functions, e.g. open(), read(), and so on. Your task is to implement the file copy using both syscall() and the wrappers. Your code should determine which method to use based on the value of the first command-line argument given to your program; if ‘s’ then use syscall() and if ‘w’ then use the wrapper functions.

Part 3: Synchronisation and threads: The final section is a version of the “producer–consumer problem”. The program creates a variable number of threads (2 ≤ N < 1024) based on command-line parameters, and threads either produce or consume data. They share a circular buffer to communicate these data to each other. If there are many producers, the buffer fills up and the producers have to wait to insert data. Conversely, if there are many consumers, the buffer can become empty and the consumers have to wait. If access to the buffer is not properly synchronised, data can be lost. Your task is to take the given source code file “prod-com.c” and fill in the sections marked TODO (the functions insert item and remove item), to make the program work effectively. The necessary variables for the semaphores and mutex are already provided and initialised in the sample code: empty and full semaphores which count the number of empty and full slots in the buffer, and mutex, which is a binary semaphore that protects the actual insertion and removal of items in the buffer. Hint: this problem is taken from the Silberschatz text book, at the end of Chapter 6. You will need to use pointers, so make sure you are clear about how pointers are written in C, how “pointer arithmetic” works to move through sequential items in memory, and how to “dereference” a pointer to access or write to the memory location that it points to. Note that you must access the buffer using pointer dereferencing, not using array indexing (i.e. without using the buffer[i] syntax). See Figure 1 for the example output of a correct solution.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CS2OS - Coursework

Part 1: Containers, scripting and UNIX CLIs: The container provided for this assessment uses the bash shell, and includes an executable named “trial”. Write a “for” loop in bash script that runs the program “trial” 20 times and sends its output to a differently named file each time. Have the script name the output files output NN.txt, where NN is 01,02,...,20 [10 marks], and also print out the name of the current file so the user can see the progress of the script.

Part 2: Programming Linux with C: Write a program that copies the first 256 bytes from the file “input.txt” to the file “output.txt”, using the Linux system call interface. The syscall() function is the lowest level of function generally available through the kernel API. Above this, there are its wrapper functions, e.g. open(), read(), and so on. Your task is to implement the file copy using both syscall() and the wrappers. Your code should determine which method to use based on the value of the first command-line argument given to your program; if ‘s’ then use syscall() and if ‘w’ then use the wrapper functions.

Part 3: Synchronisation and threads: The final section is a version of the “producer–consumer problem”. The program creates a variable number of threads (2 ≤ N < 1024) based on command-line parameters, and threads either produce or consume data. They share a circular buffer to communicate these data to each other. If there are many producers, the buffer fills up and the producers have to wait to insert data. Conversely, if there are many consumers, the buffer can become empty and the consumers have to wait. If access to the buffer is not properly synchronised, data can be lost. Your task is to take the given source code file “prod-com.c” and fill in the sections marked TODO (the functions insert item and remove item), to make the program work effectively. The necessary variables for the semaphores and mutex are already provided and initialised in the sample code: empty and full semaphores which count the number of empty and full slots in the buffer, and mutex, which is a binary semaphore that protects the actual insertion and removal of items in the buffer. Hint: this problem is taken from the Silberschatz text book, at the end of Chapter 6. You will need to use pointers, so make sure you are clear about how pointers are written in C, how “pointer arithmetic” works to move through sequential items in memory, and how to “dereference” a pointer to access or write to the memory location that it points to. Note that you must access the buffer using pointer dereferencing, not using array indexing (i.e. without using the buffer[i] syntax). See Figure 1 for the example output of a correct solution.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CS2OS - Coursework

Part 1: Containers, scripting and UNIX CLIs: The container provided for this assessment uses the bash shell, and includes an executable named “trial”. Write a “for” loop in bash script that runs the program “trial” 20 times and sends its output to a differently named file each time. Have the script name the output files output NN.txt, where NN is 01,02,...,20 [10 marks], and also print out the name of the current file so the user can see the progress of the script.

Part 2: Programming Linux with C: Write a program that copies the first 256 bytes from the file “input.txt” to the file “output.txt”, using the Linux system call interface. The syscall() function is the lowest level of function generally available through the kernel API. Above this, there are its wrapper functions, e.g. open(), read(), and so on. Your task is to implement the file copy using both syscall() and the wrappers. Your code should determine which method to use based on the value of the first command-line argument given to your program; if ‘s’ then use syscall() and if ‘w’ then use the wrapper functions.

Part 3: Synchronisation and threads: The final section is a version of the “producer–consumer problem”. The program creates a variable number of threads (2 ≤ N < 1024) based on command-line parameters, and threads either produce or consume data. They share a circular buffer to communicate these data to each other. If there are many producers, the buffer fills up and the producers have to wait to insert data. Conversely, if there are many consumers, the buffer can become empty and the consumers have to wait. If access to the buffer is not properly synchronised, data can be lost. Your task is to take the given source code file “prod-com.c” and fill in the sections marked TODO (the functions insert item and remove item), to make the program work effectively. The necessary variables for the semaphores and mutex are already provided and initialised in the sample code: empty and full semaphores which count the number of empty and full slots in the buffer, and mutex, which is a binary semaphore that protects the actual insertion and removal of items in the buffer. Hint: this problem is taken from the Silberschatz text book, at the end of Chapter 6. You will need to use pointers, so make sure you are clear about how pointers are written in C, how “pointer arithmetic” works to move through sequential items in memory, and how to “dereference” a pointer to access or write to the memory location that it points to. Note that you must access the buffer using pointer dereferencing, not using array indexing (i.e. without using the buffer[i] syntax). See Figure 1 for the example output of a correct solution.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CS2OS - Coursework

Part 1: Containers, scripting and UNIX CLIs: The container provided for this assessment uses the bash shell, and includes an executable named “trial”. Write a “for” loop in bash script that runs the program “trial” 20 times and sends its output to a differently named file each time. Have the script name the output files output NN.txt, where NN is 01,02,...,20 [10 marks], and also print out the name of the current file so the user can see the progress of the script.

Part 2: Programming Linux with C: Write a program that copies the first 256 bytes from the file “input.txt” to the file “output.txt”, using the Linux system call interface. The syscall() function is the lowest level of function generally available through the kernel API. Above this, there are its wrapper functions, e.g. open(), read(), and so on. Your task is to implement the file copy using both syscall() and the wrappers. Your code should determine which method to use based on the value of the first command-line argument given to your program; if ‘s’ then use syscall() and if ‘w’ then use the wrapper functions.

Part 3: Synchronisation and threads: The final section is a version of the “producer–consumer problem”. The program creates a variable number of threads (2 ≤ N < 1024) based on command-line parameters, and threads either produce or consume data. They share a circular buffer to communicate these data to each other. If there are many producers, the buffer fills up and the producers have to wait to insert data. Conversely, if there are many consumers, the buffer can become empty and the consumers have to wait. If access to the buffer is not properly synchronised, data can be lost. Your task is to take the given source code file “prod-com.c” and fill in the sections marked TODO (the functions insert item and remove item), to make the program work effectively. The necessary variables for the semaphores and mutex are already provided and initialised in the sample code: empty and full semaphores which count the number of empty and full slots in the buffer, and mutex, which is a binary semaphore that protects the actual insertion and removal of items in the buffer. Hint: this problem is taken from the Silberschatz text book, at the end of Chapter 6. You will need to use pointers, so make sure you are clear about how pointers are written in C, how “pointer arithmetic” works to move through sequential items in memory, and how to “dereference” a pointer to access or write to the memory location that it points to. Note that you must access the buffer using pointer dereferencing, not using array indexing (i.e. without using the buffer[i] syntax). See Figure 1 for the example output of a correct solution.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CS2OS - Coursework

Part 1: Containers, scripting and UNIX CLIs: The container provided for this assessment uses the bash shell, and includes an executable named “trial”. Write a “for” loop in bash script that runs the program “trial” 20 times and sends its output to a differently named file each time. Have the script name the output files output NN.txt, where NN is 01,02,...,20 [10 marks], and also print out the name of the current file so the user can see the progress of the script.

Part 2: Programming Linux with C: Write a program that copies the first 256 bytes from the file “input.txt” to the file “output.txt”, using the Linux system call interface. The syscall() function is the lowest level of function generally available through the kernel API. Above this, there are its wrapper functions, e.g. open(), read(), and so on. Your task is to implement the file copy using both syscall() and the wrappers. Your code should determine which method to use based on the value of the first command-line argument given to your program; if ‘s’ then use syscall() and if ‘w’ then use the wrapper functions.

Part 3: Synchronisation and threads: The final section is a version of the “producer–consumer problem”. The program creates a variable number of threads (2 ≤ N < 1024) based on command-line parameters, and threads either produce or consume data. They share a circular buffer to communicate these data to each other. If there are many producers, the buffer fills up and the producers have to wait to insert data. Conversely, if there are many consumers, the buffer can become empty and the consumers have to wait. If access to the buffer is not properly synchronised, data can be lost. Your task is to take the given source code file “prod-com.c” and fill in the sections marked TODO (the functions insert item and remove item), to make the program work effectively. The necessary variables for the semaphores and mutex are already provided and initialised in the sample code: empty and full semaphores which count the number of empty and full slots in the buffer, and mutex, which is a binary semaphore that protects the actual insertion and removal of items in the buffer. Hint: this problem is taken from the Silberschatz text book, at the end of Chapter 6. You will need to use pointers, so make sure you are clear about how pointers are written in C, how “pointer arithmetic” works to move through sequential items in memory, and how to “dereference” a pointer to access or write to the memory location that it points to. Note that you must access the buffer using pointer dereferencing, not using array indexing (i.e. without using the buffer[i] syntax). See Figure 1 for the example output of a correct solution.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors