780 likes | 1.02k Views
Network & System Programming Lecture 03 Processes, System Calls, Input/Output and Error Redirection, Inter-process Communication in Unix/Linux. March 08, 2012. Goals for Today. Interprocess communication (IPC) and process synchronization UNIX/Linux IPC tools and associated system calls
E N D
Network & System ProgrammingLecture 03Processes, System Calls, Input/Output and Error Redirection, Inter-process Communication in Unix/Linux March 08, 2012
Goals for Today • Interprocess communication (IPC) and process synchronization • UNIX/Linux IPC tools and associated system calls • UNIX/Linux standard files and kernel’s mechanism for file access • Use of pipe in a program and at the command line • Input, output, and error redirection in UNIX/Linux • FIFOs in UNIX/Linux • Use of FIFOs in a program and at the command line
Cooperating Processes • Independent process cannot affect or be affected by the execution of another process. • Cooperating process can affect or be affected by the execution of another process
Cooperating Processes • Advantages of process cooperation • Information sharing • Computation speed-up • Modularity • Convenience
Producer-Consumer Problem • Paradigm for cooperating processes, producer process produces information that is consumed by a consumer process. • unbounded-buffer places no practical limit on the size of the buffer • bounded-buffer assumes that there is a fixed buffer size
Empty Pool Consumer Producer Full Pool Bounded-Buffer Problem
Interprocess Communication (IPC) • Mechanism for processes to communicate and to synchronize their actions. • Message system – processes communicate with each other without resorting to shared variables.
Interprocess Communication (IPC) • IPC facility provides two operations: • Send (message) – message size fixed or variable • Receive (message)
Interprocess Communication (IPC) • If P and Q wish to communicate, they need to: • establish a communicationlink between them • exchange messages via send/receive
Interprocess Communication (IPC) • Implementation of communication link • physical (e.g., shared memory, hardware bus) • logical (e.g., logical properties)
Implementation Questions • How are links established? • Can a link be associated with more than two processes? • How many links can be there between every pair of communicating processes?
Implementation Questions • What is the capacity of a link? • Is the size of a message that the link can accommodate fixed or variable? • Is a link unidirectional or bi-directional?
Direct Communication • Processes must name each other explicitly: • send (P, message) – send a message to process P • Receive (Q, message) – receive a message from process Q
Direct Communication • Properties of communication link • Links are established automatically. • A link is associated with exactly one pair of communicating processes. • Between each pair there exists exactly one link. • The link may be unidirectional, but is usually bi-directional.
Indirect Communication • Messages are directed and received from mailboxes (also referred to as ports). • Each mailbox has a unique id. • Processes can communicate only if they share a mailbox.
Indirect Communication … • Properties of communication link • Link established only if processes share a common mailbox • A link may be associated with many processes. • Each pair of processes may share several communication links. • Link may be unidirectional or bi-directional.
Indirect Communication … • Operations • create a new mailbox • send and receive messages through mailbox • destroy a mailbox • Primitives are defined as: send (A, message) receive (A, message)
Indirect Communication … Mailbox sharing • P1, P2, and P3 share mailbox A. • P1, sends; P2and P3 receive. • Who gets the message?
Indirect Communication … Solutions • Allow a link to be associated with at most two processes. • Allow only one process at a time to execute a receive operation. • Allow the system to select arbitrarily the receiver. Sender is notified who the receiver was.
Synchronization • Message passing may be either blocking or non-blocking. • Blocking is considered synchronous • Non-blocking is considered asynchronous • send and receive primitives may be either blocking or non-blocking.
Buffering • Queue of messages attached to the link; implemented in one of three ways. Zero capacity – No messages Sender must wait for receiver Bounded capacity – n messages Sender must wait if link full. Unbounded capacity – infinite length Sender never waits.
File Descriptors in UNIX/Linux • An integer returned by open() system call • Used as an index in the per process file descriptor table (PPFDT) • Used in read, write, and close calls
File Descriptors in UNIX/Linux • Size of PPFDT is equal to the number of files that a process can open simultaneously (OPEN_MAX in Linux—see <linux/limits.h> • Used as an index in the per process file descriptor table (PPFDT) • Used in read, write, and close calls
P1 P2 Pipe UNIX/Linux System UNIX/Linux IPC Tools • Pipe: For communication between related processes on a system
P1 P2 FIFO UNIX/Linux System UNIX/Linux IPC Tools • Named pipe (FIFO): For communication between related or unrelated processes on a system
P1 P2 Network Connection Socket Socket Computer 1 Computer 2 UNIX/Linux IPC Tools • Socket: For communication between related or unrelated processes on the same or different systems
UNIX/Linux Pipe • Important system calls open, read, write, close, pipe • open: Open or create a file • read: Read from a pipe • write: Write data to a pipe • close: Close/destroy a pipe • pipe: Create a pipe for IPC
open System Call #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open (const char *path, int oflag, /* mode_t mode */ ...); • ‘oflag’ specifies purpose of opening the file and ‘mode’ specifies permission on the file if it is to be created.
open System Call • Returns a file descriptor on success and –1 on failure • Can specify that read and write will be blocking or non-blocking • ‘oflag’ value is constructed by ORing various flags: O_RDONLY, O_WRONLY, O_RDWR, O_NDELAY (or O_NONBLOCK), O_APPEND, O_CREAT, etc.
open System Call • Call fails • Non-existent file • Operation specified is not allowed due to file permissions • Search not allowed on a component of pathname • User’s disk quota on the file system has been exhausted
open System Call • Call fails • No write permission on the directory in which the file is being created • Signal was caught during open • Process has reached the limit of maximum open files • System limit reached on maximum number of simultaneous open files
read System Call #include <sys/types.h> #include <sys/uio.h> #include <unistd.h> ssize_t read(int fildes, void *buf, size_t nbyte); • Returns number of bytes read or -1 • Call fails and errno set accordingly • Invalid ‘fildes’, ‘buf’, or ‘nbyte’ • Signal caught during read
write System Call #include <sys/types.h> #include <unistd.h> ssize_t write (int fildes, const void *buf, size_t nbyte); • Returns the number of bytes written or -1
write System Call • Call fails • Invalid argument • File size limit for process or for system would exceed • Disk is full
File’s contents … … … … … File Descriptor to File Contents Per Process File Descriptor Table File Table Inode Table File Descriptor 0 1 2 3 4 OPEN_MAX — 1
Standard Descriptors in UNIX/Linux • Three files are automatically opened for every process for the process to read its input from and send its output and error messages to. These files are called standard files: standard input, standard output, and standard error.
Standard Descriptors in UNIX/Linux • By default, standard files are attached to the terminal on which a process runs • Descriptors for standard files are known as standard file descriptors. • Standard input: 0 (keyboard) • Standard output: 1 (display screen) • Standard error: 2 (display screen)
pipe() Call • int pipe (int pipedes[2]); • Call fails • At least two slots not empty in the PPFDT—too many files or pipe open in the process • Buffer space not available in the kernel • File table is full
UNIX/Linux Pipe • Important characteristics of a pipe • Used for communication between related processes • Used as half-duplex channel • Bounded buffer • Maximum data written is PIPE_BUF (defined in <sys/param.h> in UNIX and in <linux/param.h> in Linux)—5120 and 4096, respectively
child parent fork P P Write end Read end Example Pipe
Sample Code /* Parent creates pipe, forks a child, child writes into pipe, and parent reads from pipe */ #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> main() { int pipefd[2], pid, n, rc, nr, status; char *testString = "Hello, world!\n“, buf[1024];
Sample Code rc = pipe (pipefd); if (rc < 0) { perror("pipe"); exit(1); } pid = fork (); if (pid < 0) { perror("fork"); exit(1); }
Sample Code if (pid == 0) { /* Child’s Code */ close(pipefd[0]); write(pipefd[1], testString, strlen(testString)); close(pipefd[1]); exit(0); }
Sample Code /* Parent’s Code */ close(pipefd[1]); n = strlen(testString); nr = read(pipefd[0], buf, n); rc = write(1, buf, nr); wait(&status); printf("Good work child!\n"); return(0); }
Command Line Use of Pipes • Connect standard output of a command to standard input of another • Use the pipe operator, | • Syntax: cmd1 | cmd2 | … | cmdN
cmd1 pipe cmd2 pipe pipe cmdN Command Line Use of Pipes cmd1 | cmd2 | … | cmdN
Command Line Use of Pipes cat /etc/passwd | grep zaheer Display Screen cat pipe grep
Without Using a Pipe cat /etc/passwd | grep zaheer $ cat /etc/passwd > temp1 $ grep “zaheer” temp1 $ rm temp1
Input, Output, Error Redirection You can use the Linux redirection features to detach the default files from stdin, stdout, and stderr and attach other files with them.
Input Redirection Input Redirection: command < input-file command 0< input-file Purpose: Detach keyboard from stdin and attach ‘input- file’ to it, i.e., ‘command’ reads input from ‘input-file’ and not keyboard