Download
exercise 2 process creation termination and interprocess communication n.
Skip this Video
Loading SlideShow in 5 Seconds..
Exercise #2: Process Creation/Termination and Interprocess Communication PowerPoint Presentation
Download Presentation
Exercise #2: Process Creation/Termination and Interprocess Communication

Exercise #2: Process Creation/Termination and Interprocess Communication

153 Views Download Presentation
Download Presentation

Exercise #2: Process Creation/Termination and Interprocess Communication

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. Exercise #2: Process Creation/Termination and Interprocess Communication J. H. Wang Mar. 30, 2010

  2. Objectives • To get you familiar with program development in Linux and Windows • To learn how to create and terminate a process • To understand the major system calls for interprocess communication

  3. Processes • Monitoring processes • Ctrl-Alt-Del (in Windows) • ps –el (in UNIX/Linux) • Running processes in background • <command> & • Put background process into foreground • fg • Terminating a process • kill -9 <pid>

  4. Program Compilation • UNIX-like environment • Cygwin • Remote host • telnet 140.124.13.2 (SunOS) • Linux • Virtual machine running Linux (via VMPlayer) • Editors • UNIX: vi, joe, … • Windows: notepad, … • Compilers • UNIX: gcc, … • Windows: Dev-C++, Visual C++, …

  5. Process Creation in UNIX #include <sys/types.h> #include <stdio.h> #include <unistd.h> int main() { pid_t pid; /* fork another process */ pid = ? (); if (pid < 0) { /* error occurred */ fprintf(stderr, "Fork Failed"); exit(-1); } else if (pid == 0) { /* child process */ execlp("/bin/ls", "ls", NULL); } else { /* parent process */ /* parent will wait for the child to complete */ ? (NULL); printf ("Child Complete"); exit(0); } }

  6. Process Creation in Win32 #include <windows.h> #include <stdio.h> int main( VOID ) { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); // Start the child process.

  7. if( ! ? ( NULL, // No module name (use command line). "C:\\WINDOWS\\system32\\mspaint.exe", // Command line. NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. 0, // No creation flags. NULL, // Use parent's environment block. NULL, // Use parent's starting directory. &si, // Pointer to STARTUPINFO structure. &pi ) // Pointer to PROCESS_INFORMATION structure. ) { printf( "CreateProcess failed (%d).\n", GetLastError() ); return -1; } // Wait until child process exits. ? ( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); }

  8. Exercises • Process creation in UNIX: Ex. 3.13 • Process creation in Win32: Ex. 3.14

  9. Interprocess Communication • POSIX shared-memory (Fig. 3.16) • socket (Fig. 3.19, 3.20) • pipes (Fig. 3.23-3.27) • ordinary pipes in UNIX • anonymous pipes in Windows • named pipes

  10. POSIX Shared Memory API #include <stdio.h> #include <sys/shm.h> #include <sys/stat.h> int main() { /* the identifier for the shared memory segment */ int segment_id; /* a pointer to the shared memory segment */ char* shared_memory; /* the size (in bytes) of the shared memory segment */ const int segment_size = 4096; /** allocate a shared memory segment */ segment_id = ? (IPC_PRIVATE, segment_size, S_IRUSR | S_IWUSR); /** attach the shared memory segment */ shared_memory = (char *) ? (segment_id, NULL, 0); printf("shared memory segment %d attached at address %p\n", segment_id, shared_memory);

  11. /** write a message to the shared memory segment */ sprintf(shared_memory, "Hi there!"); /** now print out the string from shared memory */ printf("*%s*\n", shared_memory); /** now detach the shared memory segment */ if ( ? (shared_memory) == -1) { fprintf(stderr, "Unable to detach\n"); } /** now remove the shared memory segment */ shmctl(segment_id, IPC_RMID, NULL); return 0; }

  12. Socket • To be explained in computer network programming • BSD socket • Java socket • WinSock

  13. A Sample Date Client in Java import java.net.*; import java.io.*; public class DateClient { public static void main(String[] args) { try { // this could be changed to an IP name or address other than the localhost Socket sock = new Socket("127.0.0.1",6013); InputStream in = sock.getInputStream(); BufferedReader bin = new BufferedReader(new InputStreamReader(in)); String line; while( (line = bin.readLine()) != null) System.out.println(line); sock.close(); } catch (IOException ioe) { System.err.println(ioe); } } }

  14. A Sample Date Server in Java import java.net.*; import java.io.*; public class DateServer { public static void main(String[] args) { try { ServerSocket sock = new ServerSocket(6013); // now listen for connections while (true) { Socket client = sock.accept(); // we have a connection PrintWriter pout = new PrintWriter(client.getOutputStream(), true); // write the Date to the socket pout.println(new java.util.Date().toString()); // close the socket and resume listening for more connections client.close(); } } catch (IOException ioe) { System.err.println(ioe); } } }

  15. Ordinary Pipes in UNIX #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <string.h> #define BUFFER_SIZE 25 #define READ_END 0 #define WRITE_END 1 int main(void) { char write_msg[BUFFER_SIZE] = "Greetings"; char read_msg[BUFFER_SIZE]; pid_t pid; int fd[2]; /** create the pipe */ if ( ? (fd) == -1) { fprintf(stderr,"Pipe failed"); return 1; }

  16. /** now fork a child process */ pid = ? (); if (pid < 0) { fprintf(stderr, "Fork failed"); return 1; } if (pid > 0) { /* parent process */ /* close the unused end of the pipe */ close(fd[READ_END]); /* write to the pipe */ ? (fd[WRITE_END], write_msg, strlen(write_msg)+1); /* close the write end of the pipe */ close(fd[WRITE_END]); }

  17. else { /* child process */ /* close the unused end of the pipe */ close(fd[WRITE_END]); /* read from the pipe */ ? (fd[READ_END], read_msg, BUFFER_SIZE); printf("child read %s\n",read_msg); /* close the write end of the pipe */ close(fd[READ_END]); } return 0; }

  18. Anonymous Pipes in Windows – Parent Process #include <stdio.h> #include <stdlib.h> #include <windows.h> #define BUFFER_SIZE 25 int main(VOID) { HANDLE ReadHandle, WriteHandle; STARTUPINFO si; PROCESS_INFORMATION pi; char message[BUFFER_SIZE] = "Greetings"; DWORD written; /* set up security attributes so that pipe handles are inherited */ SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL,TRUE}; /* allocate memory */ ZeroMemory(&pi, sizeof(pi)); /* create the pipe */ if ( ! ? (&ReadHandle, &WriteHandle, &sa, 0)) { fprintf(stderr,"Create Pipe Failed\n"); return 1; }

  19. /* establish the START_INFO structure for the child process */ GetStartupInfo(&si); si.hStdError = GetStdHandle(STD_ERROR_HANDLE); si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); /* redirect the standard input to the read end of the pipe */ si.hStdInput = ReadHandle; si.dwFlags = STARTF_USESTDHANDLES; /* we do not want the child to inherit the write end of the pipe */ SetHandleInformation( WriteHandle, HANDLE_FLAG_INHERIT, 0); /* create the child process */ if (! ? (NULL, ".\\child.exe", NULL, NULL, TRUE, /* inherit handles */ 0, NULL, NULL, &si, &pi)) { fprintf(stderr, "Process Creation Failed\n"); return -1; }

  20. /* close the unused end of the pipe */ CloseHandle(ReadHandle); /* the parent now wants to write to the pipe */ if (! ? (WriteHandle, message, BUFFER_SIZE, &written, NULL)) fprintf(stderr, "Error writing to pipe\n"); /* close the write end of the pipe */ CloseHandle(WriteHandle); /* wait for the child to exit */ ? (pi.hProcess, INFINITE); /* close all handles */ CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }

  21. Anonymous Pipes in Windows – Child Process #include <stdio.h> #include <windows.h> #define BUFFER_SIZE 25 int main(VOID) { HANDLE ReadHandle, WriteHandle; CHAR buffer[BUFFER_SIZE]; DWORD read; ReadHandle = GetStdHandle(STD_INPUT_HANDLE); WriteHandle= GetStdHandle(STD_OUTPUT_HANDLE); /* have the child read from the pipe */ if ( ? (ReadHandle, buffer, BUFFER_SIZE, &read, NULL)) printf("child: >%s<",buffer); else fprintf(stderr, "Child: Error reading from pipe\n"); return 0; }

  22. Named Pipes • FIFO in UNIX • mkfifo() • open() • read() • write() • close() • Named pipes in Windows • CreateNamedPipe() • ConnectNamedPipe() • ReadFile() • WriteFile()

  23. Exercises • POSIX shared memory: Ex. 3.17, 3.20 • Ordinary pipes: Ex. 3.18, 3.19, • Java socket: Ex. 3.15, 3.16

  24. Further Reading • Programming Project 3.21: POSIX Message Passing • Overview • The message passing system • Creating the processes • Implementation hints