210 likes | 310 Vues
Some Example C Programs. These programs show how to use the exec function. exec Function calls. Used to begin a processes execution. Accomplished by overwriting process imaged of caller with that of called. Several flavors, use the one most suited to needs. exec Function calls.
E N D
exec Function calls Used to begin a processes execution. Accomplished by overwriting process imaged of caller with that of called. Several flavors, use the one most suited to needs.
exec Function calls int execv( char *path, char *argv[]) ; path: directory path to executable image. Can be your program, or system program. argv: Array of pointers to null terminated strings. These are the arguments to the program being executed.
exec Function calls two conventions with argv: 1) argv[0] should hold the name of the program to be executed. 2) The last element must be NULL.
main (int argc, *argv[]) { int pid ; char *args[2] ; pid = fork() ; if (pid ==0) { args[0] = “./a.out” ; All executed by args[1] = NULL ; child process i = execv(“./aout”, args) ; printf(“OOOpppssss.\n”) ; } else printf(“Not a problem!\n”) ; Executed by parent }
int pid ; char *args[2] ; pid = fork() ;
Parent Child int pid ; char *args[2] ; pid = 0 int pid ; char *args[2] ; pid = ? fork
Child int pid ; char *args[2] ; pid = fork() if (pid == 0) {args[0] = “./a.out” ; args[1] = NULL ; i = execv(“./aout”, args) ; printf(“OOOpppssss.\n”) ; } else printf(“Not ….”);
Parent int pid ; char *args[2] ; pid = fork() if (pid == 0) {args[0] = “./a.out” ; args[1] = NULL ; i = execv(“./aout”, args) ; printf(“OOOpppssss.\n”) ; } else printf(“Not ….”);
Child int pid ; char *args[2] ; pid = fork() if (pid == 0) {args[0] = “./a.out” ; args[1] = NULL ; i = execv(“./aout”, args) ; printf(“OOOpppssss.\n”) ; } else printf(“Not ….”); Parent int pid ; char *args[2] ; pid = fork() if (pid == 0) {args[0] = “./a.out” ; args[1] = NULL ; i = execv(“./aout”, args) ; printf(“OOOpppssss.\n”) ; } else printf(“Not ….”);
Parent a.out int pid ; char *args[2] ; pid = fork() if (pid == 0) {args[0] = “./a.out” ; args[1] = NULL ; i = execv(“./aout”, args) ; printf(“OOOpppssss.\n”) ; } else printf(“Not ….”);
#include <unistd.h> #include <stdio.h> main() { char *ptr ; char input[1024] ; int i ; while(1) { i = read(0, input, 512) ; //read from stdin ptr = input ; while (*ptr != '\n') { if (*ptr == ' ') printf("Space!\n") ; else printf("Read %c\n", *ptr) ; ptr++ ; } } }
#include <unistd.h> #include <stdio.h> main() { char *ptr ; char input[512] ; int i ; while(1) { i = read(0, input, 512) ; //read from stdin ptr = input ; In C, the name of an array is the base address of the array. Now ptr points to the first element of array input.
#include <unistd.h> #include <stdio.h> main() { char *ptr ; char input[512] ; int i ; while(1) { i = read(0, input, 512) ; //read from stdin ptr = input ; while (*ptr != '\n') ptr is the address of a character. *ptr dereferences the pointer to give the actual value at that address. T h i s i s ptr = 140 *ptr = ‘T’ 140 141 142 ............................
{ if (*ptr == ' ') printf("Space!\n") ; else printf("Read %c\n", *ptr) ; ptr++ ; } printf statement prints string to terminal. Uses control string and variables. printf(“Read %c\n”, *ptr) ; Other control characters are %d: integer %s: string %l: long int %f: float/double EXAMPLE
These slides show how to use the fork() and exec() system calls.
Simple program to fork a new process #include <stdio.h> main (int argc, char *argv[]) { int pid ; char *args[2] ; printf("Ready to FORK\n") ; pid = fork() ; if (pid ==0) printf("I AM THE CHILD!!\n") ; else printf("I AM THE PARENT!!!\n") ; }
Simple program to start a new process executing #include <stdio.h> main (int argc, char *argv[]) { int pid ; char *args[2] ; printf("Ready to FORK\n") ; pid = fork() ; if (pid ==0) { printf("I AM THE CHILD!!\n") ; args[0] = "./a.out" ; args[1] = NULL ; execv("./a.out", args) ; printf("OPPSSSS\n") ; } else printf("I AM THE PARENT!!!\n") ; wait(NULL) ; }
Simple program to show how children get out of control if not monitored by the parent. #include <stdio.h> main (int argc, char *argv[]) { int pid ; char *args[2] ; printf("Ready to FORK\n") ; pid = fork() ; if (pid ==0) { printf("I AM THE CHILD!!\n") ; args[0] = "./a.out" ; args[1] = NULL ; execv("./a.out", args) ; printf("OPPSSSS\n") ; } else printf("I AM THE PARENT!!!\n") ; //wait(NULL) ; }