CENG251: Assignment #5

Total Page:16

File Type:pdf, Size:1020Kb

CENG251: Assignment #5 Out: March 30, 2021 Due: Wed Apr 14, 2021 There are 30 marks. Please keep and submit a time log to account for what you’ve done. CENG251: Assignment #5 Part I: C Language Features (8 marks) In class we demonstrated re-entrant code by comparing the use of ctime vs ctime_r. We showed that ctime always returned the same memory location and that ctime_r avoided this problem by passing the memory to be filled which was then returned with a different result; Write a single small C program that 1. Demonstrates that getpwuid and getpwnam are not reentrant by calling each of these twice with different valid arguments and displaying the return address and the content of the passwd structure returned. Prepare your output string using fmemopen and then writing the output to a string using a file pointer before writing the string to the terminal. An example of using fmemopen can be found in the example program stringIODemo.c (3) 2. Continue the program and call getpwuid_r and getpwnam_r with correct arguments. Prepare your output string using sprintf and then display the string to the terminal. Examples of long structured format strings can be seen in the example program stringIODemo.c (3) 3. In ctimeDemo.c we demonstrated the use of strdup to preserve the result of ctime from one function call to the next. Use malloc and memcpy to do the same for getpwuid and show that this worked displaying the values from the copy. (2) Part II: Signals (8 marks) The following exercises should be done as a single program. Show that your program works by sending it signals using kill from the shell. 1. Create a program that reacts to 2 different signals, SIGCHLD and one of the unused realtime signals and then goes into a forever loop. Have each signal output a unique message. (2) 2. Add a signal handler that responds to SIGUSR1 by listing all the C files in a specified directory using a readdir loop. The directory should be specified using either an environment variable or through the command line. Document which you do. (3) 3. Add a signal handler that responds to SIGURS2 by listing then names of all executable files a specified directory sorted by inode number using a call to scandir. After scandir returns display the list of files along with their inode #s and permissions. (3 marks) Part III: Multitasking using fork (14 marks) 1. In class we demonstrated 3 different styles of forking a process were used. Use a different style for each experiment a-c. Use a separate program for each of a-c. a. Creating an orphan process: (2 marks) A child process who’s parent has died is known as an orphan process. Write a short program that creates a single child. Have the main process die right away but leave the child still executing in an infinite loop. When the main program has completed: Run the shell command: ps -u $USER –O ppid What is the process id of this child’s parent? What is the State of the child? Kill the child when you are done. b. Creating a zombie process: (2 marks) When a child process completes a record is kept in the system’s process table. A zombie process is a child process that has died without it’s exit code being picked up by the parent. Write a short program that creates a single child. Have the child process die right away but leave the parent running either in a loop or an extended sleep. Do not use a wait statement to wait for the child. Run the command: ps -u $USER –O ppid (type in the letters ppid literally, not a parent process id) and examine the column headings: What is the process id of the child’s parent? What is the State of the child? c. Reaping a process: (2 marks) Write a short program that creates a single child. i. The child should output its process id and exit with a non-zero exit code. ie: exit(17) The parent should wait for the child to complete and report the pid of the child and the reason (status code) that it exited by recovering it from the status variable passed to the wait function call. Use the macro WEXITSTATUS to obtain the status. The wait function itself returns the pid of the child. 2. exec and forking with signals (8 marks) A key safeguard in forking a process is that the child process must immediately branch away from the parent and never return. One method to ensure this is that the child uses an exec function call, one of execvp, execl, execlp, execle, execve or execvpe - all of which, if successful, launch a new process. (Using strace we can demonstrate that every program launched from the bash shell used execve.) (8 marks) Write a single program that launches 3 child programs each using a different forking style. At the top of the program use code from sigIgnoreDemo.c to make sure that all realtime signals are initially set to SIG_IGN. a. The 1st child program should run your getopt or getopt_long program from an earlier assignment. Supply the flags and supplemental non flag arguments using a call to an exec function. This should be done either by passing a null terminate array of arguments or a null terminated list. By observing the behaviour of your getopt program explain that you were able to prove that your call to exec succeeded in passing different arguments to the child, or why it did not? (2 marks) b. In the parent process, before any fork, create a completely new set of environment variables and then exec the program showEnvp or your correctly modified version of the program from Assignment #1. You can do this in any of 3 ways: (2 marks) i. Use execle which takes a null terminated list of environment variable definitions. ii. Use execve or execvpe which takes a null terminated array of environment variable def’ns. iii. Use clearenv to remove all environment variable definitions, then putenv or setenv to define 3 or 4 variables then call either execv, execl or execvp, neither of which directly pass any environment variables but cause the child to inherit the environment of the parent. iv. Write up whether or not it worked. c. Create an execMyTask function that runs as the 3rd child of your parent process. (4) i. before launching the child set up signal handler for an unused realtime signal that outputs a unique message. ii. Have the child process set up a signal handler for another unused realtime signal that outputs a different unique message. iii. The child process should announce that it is a child, what its pid and parent id are and then go into an infinite loop. iv. After the child process is launched let the parent process sleep for a short while to make absolutely sure that the child is established. Then set up a 3rd signal handler for the main program using a 3rd unused realtime signal that prints a 3rd unique message. v. Have the parent process send all 3 signals to itself using raise to prove that the parent only reacts to its own signals and not the one in the child. vi. Have the parent process use kill to send a signal 0 to the child to prove that the child is still running. (It should be because it has an infinite loop) vii. Have the parent process use kill to send all 3 realtime signals to the child to prove that the child inherits the signal handler created before it was launched, recognizes the signal handler created in the child and ignores the one after it was launched. viii. Have the parent kill the child and reap the child id and the signal # used to kill it. ix. Send a signal of 0 to the child to prove that the child is no longer running. Summary: Launch a child process and send the child a bunch of signals to figure out what it inherits, what it knows about and whether its still running. x. Summarize the results: 1. Did the child inherit signal handlers from the parent? 2. Did the parent inherit signal handler from the child? 3. Can the parent detect if the child is still running, recover the signal used to terminate it and detect when it is no longer running? .
Recommended publications
  • Tutorials Point, Simply Easy Learning
    Tutorials Point, Simply Easy Learning UML Tutorial Tutorialspoint.com UNIX is a computer Operating System which is capable of handling activities from multiple users at the same time. Unix was originated around in 1969 at AT&T Bell Labs by Ken Thompson and Dennis Ritchie. This tutorial gives an initial push to start you with UNIX. For more detail kindly check tutorialspoint.com/unix What is Unix ? The UNIX operating system is a set of programs that act as a link between the computer and the user. The computer programs that allocate the system resources and coordinate all the details of the computer's internals is called the operating system or kernel. Users communicate with the kernel through a program known as the shell. The shell is a command line interpreter; it translates commands entered by the user and converts them into a language that is understood by the kernel. Unix was originally developed in 1969 by a group of AT&T employees at Bell Labs, including Ken Thompson, Dennis Ritchie, Douglas McIlroy, and Joe Ossanna. There are various Unix variants available in the market. Solaris Unix, AIX, UP Unix and BSD are few examples. Linux is also a flavour of Unix which is freely available. Several people can use a UNIX computer at the same time; hence UNIX is called a multiuser system. A user can also run multiple programs at the same time; hence UNIX is called multitasking. Unix Architecture: Here is a basic block diagram of a UNIX system: 1 | P a g e Tutorials Point, Simply Easy Learning The main concept that unites all versions of UNIX is the following four basics: Kernel: The kernel is the heart of the operating system.
    [Show full text]
  • Process Manager Ext2fs Proc Devfs Process Management Memory Manager Scheduler Minix Nfs Msdos Memory Management Signaling
    Embedded Systems Prof. Myung-Eui Lee (A-405) [email protected] Embedded Systems 1-1 KUT Linux Structure l Linux Structure proc1 proc2 proc3 proc4 proc5 procn User Space System Call Interface Filesystem Manager Process Manager Ext2fs proc devfs Process Management Memory Manager Scheduler minix nfs msdos Memory Management Signaling Buffer Cache Kernel Space Device Manager Network Manager char block Ipv6 ethernet Console KBD SCSI CD-ROM PCI network ….. Device Interface dev1 dev2 dev3 dev4 devn Embedded Systems 1-2 KUT Linux Structure l Linux Structure Applications: Graphics UI, Compilers, Media player UI Text UI = Shell: sh, csh, ksh, bash, tcsh, zsh Compiler libraries (libc.a) API System Shared Libraries (System Call Interface) Memory File Process management management management Kernel Device Drives BIOS Computer Hardware Embedded Systems 1-3 KUT System Call Interface Standard C Lib. System Call C program invoking printf() library call, API – System call – OS Relationship which calls write() system call ar –t /usr/lib/libc.a | grep printf /usr/src/linux-2.4/arch/i386/kernel/entry.S Embedded Systems 1-4 KUT System Call l System calls define the programmer interface to Linux system » Interface between user-level processes and hardware devices u CPU, memory, disks etc. » Make programming easier u Let kernel take care of hardware-specific issues » Increase system security u Let kernel check requested service via system call » Provide portability u Maintain interface but change functional implementation l Roughly five categories of system calls
    [Show full text]
  • System Calls & Signals
    CS345 OPERATING SYSTEMS System calls & Signals Panagiotis Papadopoulos [email protected] 1 SYSTEM CALL When a program invokes a system call, it is interrupted and the system switches to Kernel space. The Kernel then saves the process execution context (so that it can resume the program later) and determines what is being requested. The Kernel carefully checks that the request is valid and that the process invoking the system call has enough privilege. For instance some system calls can only be called by a user with superuser privilege (often referred to as root). If everything is good, the Kernel processes the request in Kernel Mode and can access the device drivers in charge of controlling the hardware (e.g. reading a character inputted from the keyboard). The Kernel can read and modify the data of the calling process as it has access to memory in User Space (e.g. it can copy the keyboard character into a buffer that the calling process has access to) When the Kernel is done processing the request, it restores the process execution context that was saved when the system call was invoked, and control returns to the calling program which continues executing. 2 SYSTEM CALLS FORK() 3 THE FORK() SYSTEM CALL (1/2) • A process calling fork()spawns a child process. • The child is almost an identical clone of the parent: • Program Text (segment .text) • Stack (ss) • PCB (eg. registers) • Data (segment .data) #include <sys/types.h> #include <unistd.h> pid_t fork(void); 4 THE FORK() SYSTEM CALL (2/2) • The fork()is one of the those system calls, which is called once, but returns twice! Consider a piece of program • After fork()both the parent and the child are ..
    [Show full text]
  • Troubleshoot Zombie/Defunct Processes in UC Servers
    Troubleshoot Zombie/Defunct Processes in UC Servers Contents Introduction Prerequisites Requirements Components Used Background Information Check Zombies using UCOS Admin CLI Troubleshoot/Clear the Zombies Manually Restart the Appropriate Service Reboot the Server Kill the Parent Process Verify Introduction This document describes how to work with zombie processes seen on CUCM, IMnP, and other Cisco UC products when logged in using Admin CLI. Prerequisites Requirements Cisco recommends that you have knowledge of using Admin CLI of the UC servers: ● Cisco Unified Communications Manager (CUCM) ● Cisco Unified Instant Messaging and Presence Server (IMnP) ● Cisco Unity Connection Server (CUC) Components Used This document is not restricted to specific software and hardware versions. The information in this document was created from the devices in a specific lab environment. All of the devices used in this document started with a cleared (default) configuration. If your network is live, ensure that you understand the potential impact of any command. Background Information The Unified Communications servers are essentially Linux OS based applications. When a process dies on Linux, it is not all removed from memory immediately, its process descriptor (PID) stays in memory which only takes a tiny amount of memory. This process becomes a defunct process and the process's parent is notified that its child process has died. The parent process is then supposed to read the dead process's exit status and completely remove it from the memory. Once this is done using the wait() system call, the zombie process is eliminated from the process table. This is known as reaping the zombie process.
    [Show full text]
  • Processes in Linux/Unix
    Processes in Linux/Unix A program/command when executed, a special instance is provided by the system to the process. This instance consists of all the services/resources that may be utilized by the process under execution. • Whenever a command is issued in unix/linux, it creates/starts a new process. For example, pwd when issued which is used to list the current directory location the user is in, a process starts. • Through a 5 digit ID number unix/linux keeps account of the processes, this number is call process id or pid. Each process in the system has a unique pid. • Used up pid’s can be used in again for a newer process since all the possible combinations are used. • At any point of time, no two processes with the same pid exist in the system because it is the pid that Unix uses to track each process. Initializing a process A process can be run in two ways: 1. Foreground Process : Every process when started runs in foreground by default, receives input from the keyboard and sends output to the screen. When issuing pwd command $ ls pwd Output: $ /home/geeksforgeeks/root When a command/process is running in the foreground and is taking a lot of time, no other processes can be run or started because the prompt would not be available until the program finishes processing and comes out. 2. Backround Process : It runs in the background without keyboard input and waits till keyboard input is required. Thus, other processes can be done in parallel with the process running in background since they do not have to wait for the previous process to be completed.
    [Show full text]
  • Unit-Iv Process,Signals and File Locking
    UNIT-IV PROCESS, SIGNALS AND FILE LOCKING III-I R14 - 14BT50502 PROCESS: When you execute a program on your UNIX system, the system creates a special environment for that program. This environment contains everything needed for the system to run the program as if no other program were running on the system. Whenever you issue a command in UNIX, it creates, or starts, a new process. When you tried out the ls command to list directory contents, you started a process. A process, in simple terms, is an instance of a running program. When you start a process (run a command), there are two ways you can run it − Foreground Processes Background Processes FOREGROUND PROCESSES: By default, every process that you start runs in the foreground. It gets its input from the keyboard and sends its output to the screen. Example: $ls ch*.doc When a program is running in foreground and taking much time, we cannot run any other commands (start any other processes) because prompt would not be available until program finishes its processing and comes out. BACKGROUND PROCESSES: A background process runs without being connected to your keyboard. If the background process requires any keyboard input, it waits. The advantage of running a process in the background is that you can run other commands; you do not have to wait until it completes to start another! The simplest way to start a background process is to add an ampersand (&) at the end of the command. Example: $ls ch*.doc & PROCESS IDENTIFIERS: The process identifier – normally referred to as the process ID or just PID, is a number used by most operating system kernels such as that of UNIX, Mac OS X or Microsoft Windows — to uniquely identify an active process.
    [Show full text]
  • A Guide to Inter-Process Communication in Linux
    Opensource.com A guide to inter-process communication in Linux Learn how processes synchronize with each other in Linux. By Marty Kalin . A GUIDE TO INTER-PROCESS COMMUNICATION IN LINUX . CC BY-SA 4.0 . OPENSOURCE.COM 1 OPENSOURCE.COM ..................................................................... ABOUT OPENSOURCE.COM What is Opensource.com? publishes stories about creating, OPENSOURCE.COM adopting, and sharing open source solutions. Visit Opensource.com to learn more about how the open source way is improving technologies, education, business, government, health, law, entertainment, humanitarian efforts, and more. Submit a story idea: opensource.com/story Email us: [email protected] . 2 A GUIDE TO INTER-PROCESS COMMUNICATION IN LINUX . CC BY-SA 4.0 . OPENSOURCE.COM . ABOUT THE AUTHOR MARTY KALIN IN COMPUTER SCIENCE (College of Computing and I ’M AN ACADEMIC Digital Media, DePaul University) with wide experience in software development, mostly in production planning and scheduling (steel industry) and product configuration (truck and bus manufacturing). Details on books and other publications are available at: Marty Kalin’s hompage FO OLL W MARTY KALIN T witter: @kalin_martin . A GUIDE TO INTER-PROCESS COMMUNICATION IN LINUX . CC BY-SA 4.0 . OPENSOURCE.COM 3 OPENSOURCE.COM ..................................................................... INTRODUCTION Introduction 5 CHAPTERS Shared storage 6 Using pipes and message queues 12 Sockets and signals 19 Wrapping up this guide 24 GET INVOLVED | ADDITIONAL RESOURCES Write for Us 25 . 4 A GUIDE TO INTER-PROCESS COMMUNICATION IN LINUX . CC BY-SA 4.0 . OPENSOURCE.COM . INTRODUCTION Introduction interprocess communication (ipc) in Linux. The THIS GUIDE IS AboUT guide uses code examples in C to clarify the following IPC mechanisms: • Shared files • Shared memory (with semaphores) • Pipes (named and unnamed) • Message queues • Sockets • Signals I’ll introduce you to some core concepts before moving on to the first two of these mech- anisms: shared files and shared memory.
    [Show full text]
  • Loris/Tissino /La/Mia/Cassetta/Degli/Attrezzi/Linux
    /loris/tissino /la/mia/cassetta/degli/attrezzi/linux www.tissino.it/docs/linux Indice 1 Introduzione 17 1.1 Questa cassetta . 17 1.1.1 A chi `erivolta . 17 1.1.2 Formati e diffusione . 17 1.1.3 Errori . 17 1.1.4 Licenza . 17 1.2 Bibliografia e documentazione . 17 1.2.1 PDF . 17 1.2.2 Libri . 18 1.2.3 Siti web . 18 1.2.4 Man . 18 1.2.5 Whatis . 18 1.2.6 Apropos . 19 1.2.7 Info . 19 1.2.8 —help . 19 1.2.9 /usr/share/doc . 19 1.2.10 HOWTO e WWW . 19 1.3 Il concetto di software libero . 20 1.3.1 Il software . 20 1.3.2 Programma . 20 1.3.3 Applicazione . 20 1.3.4 Sistema operativo . 20 1.3.5 Programma sorgente ed eseguibile . 20 1.3.6 Free Software Foundation . 21 1.3.7 Copyright e Copyleft . 21 1.3.8 Licenze . 21 1.3.9 Open Source . 21 1.3.10 Altri tipi di licenza . 22 1.4 Differenze tra Windows e GNU/Linux . 22 1.4.1 Differenze tra Microsoft Windows e GNU/Linux . 22 1.4.2 Sicurezza . 22 1.4.3 Disponibilit`adi software . 22 1.4.4 i18n e l10n . 22 1.4.5 Gestione del software . 23 1.4.6 File system . 23 1.4.7 Nomi di file e directory . 23 1.4.8 Estensioni . 23 1.4.9 Permessi su file e directory . 23 1.4.10 File nascosti e attributi .
    [Show full text]
  • Processes – CSC252
    Processes – CSC252 PROF. EARL Some slides adopted from Dr. John Carelli and Dr. Lisa Frye User • Programs that the user interacts with User vs or launches themselves Kernel Kernel • Provides services to user space. Space Manages hardware and resources for multiple users. User processes access this space through system calls Hardware Processes https://goo.gl/images/381BdN Processes A single process is the execution of command by the Linux Kernel Every process (besides init) has a Process ID (PID) and Parent Process ID (PPID) Processes are “spawned” from another System Calls Allow a program in user space to interact with the kernel fork() – Allows for a process to create a new sub-process (A child process) The PPID of the new process, would be the PID of the process that called fork() exec() – Execute a new command replace the process with the new one. Sessions The lifetime a user login process When a user logins into a linux machine, a new shell process is created job – A command pipeline ; - Separate Commands & - Run the command in the background Basic Process Commands history – log of past commands jobs – List of currently running jobs kill – Terminal a process fg,bg – Move a process to the foreground/background ps – List processes top – View top running processes uptime – View how long system has been running free – View available memory (RAM) pstree – Show process tree nohup – run command immune to hangups Review the student presentations as posted on D2L (except for ps) The Process Table Data structure that exists in Kernel Space Contains the following: Process ID Process Owner Process Priority Environment variables for each process The Parent Process Location of its code, data, stack, and user area Pending Signals The ps command UNIX command that allows you to view information from the process table.
    [Show full text]
  • Kill a Zombie! a Process Is Called a Zombie Process If the Process Has
    Kill a Zombie! A process is called a zombie process if the process has been completed, but its PID and process entry remains in the Linux process table. A process is removed from the process table when the process is completed, and its parent process reads the completed process' exit status by using the wait() system call. If a parent process fails to call wait() for whatever reason, its child process will be left in the process table, becoming a zombie. To find zombie processes on Linux: $ ps axo stat,ppid,pid,comm | grep -w defunct Z 250 10242 fake-prog <defunct> The above command searches for processes with zombie (defunct) state, and displays them in (state, PPID, PID, command-name) format. The sample output shows that there is one zombie process associated with "fake-prog", and it was spawned by a parent process with PID 250. Killing zombie processes is not obvious since zombie processes are already dead. You can try two options to kill a zombie process on Linux as follows. First, you can try sending SIGCHLD signal to the zombie's parent process using the kill command. Note that the above command gives you PPID (PID of parent process) of each zombie. In our example, PPID of the zombie is 250. $ sudo kill -s SIGCHLD 250 If a zombie process still does not go away, you can kill the parent process (e.g., 250) of the zombie. $ sudo kill -9 250 Once its parent process gets killed, the zombie will be adopted by the init process, which is a parent of all processes in Linux.
    [Show full text]
  • Operating Systems Processes and Threads
    COS 318: Operating Systems Processes and Threads Prof. Margaret Martonosi Computer Science Department Princeton University http://www.cs.princeton.edu/courses/archive/fall11/cos318 Today’s Topics Processes Concurrency Threads Reminder: Hope you’re all busy implementing your assignment 2 (Traditional) OS Abstractions Processes - thread of control with context Files- In Unix, this is “everything else” Regular file – named, linear stream of data bytes Sockets - endpoints of communication, possible between unrelated processes Pipes - unidirectional I/O stream, can be unnamed Devices Process Most fundamental concept in OS Process: a program in execution one or more threads (units of work) associated system resources Program vs. process program: a passive entity process: an active entity For a program to execute, a process is created for that program Program and Process main() main() { { heap ... ... foo() foo() ... ... } } stack bar() bar() { { registers ... ... PC } } Program Process 5 Process vs. Program Process > program Program is just part of process state Example: many users can run the same program • Each process has its own address space, i.e., even though program has single set of variable names, each process will have different values Process < program A program can invoke more than one process Example: Fork off processes 6 Simplest Process Sequential execution No concurrency inside a process Everything happens sequentially Some coordination may be required Process state Registers Main memory I/O devices • File system • Communication ports … 7 Process Abstraction Unit of scheduling One (or more*) sequential threads of control program counter, register values, call stack Unit of resource allocation address space (code and data), open files sometimes called tasks or jobs Operations on processes: fork (clone-style creation), wait (parent on child), exit (self-termination), signal, kill.
    [Show full text]
  • Tutorial 2 : Process Management
    Tutorial 2 : Process Management August 20, 2019 Objective : • This assignment is intended to learn how to create, work with and ma- nipulate processes in Linux. You are expected to refer to the text book and references mentioned in the course website befor you start the lab. Some sample codes for process creation using fork system call have been provided for your reference. Instructions • You are expected to run all the sample codes provided in the Helpful Re- sources section. It will help you understand how OS virtualizes CPU and memory. Some of the codes are related to process creation and execution using Unix based system calls such as fork,exit,wait and exec Tutorials 1. Tut1 : Memory Virtualization : Physical memory model presents Memory as an array of bytes. The data stored at an address of memory can be read by providing the address of the location wehere the data resides. Similarly, while writing data to any address of a memory, one needs to specify the address for writing as well as the data to be written to the given address. Memory is accessed all the time when a program is running. A program keeps all of its data structures in memory, and accesses them through various instruction. In- structions themeselves reside in the memory which have to be fetched. Instructions : Execute the code mem.c from the Helpful Resources sec- tion. Make sure to include the common.h file in the same folder as the mem.c. To execute use the following commands : gcc mem.c ./a.out ox200000 The program does a couple of things.
    [Show full text]