220 likes | 457 Views
Using System Calls (Unix). Have to tell compiler (if C/C++) where to find the headers, etc. – i.e., the “include” files May have to tell compiler where the library itself lives Use Unix “man” pages to tell you about this for each system call Other resources. Recall Parameters to main in C.
E N D
Using System Calls (Unix) • Have to tell compiler (if C/C++) where to find the headers, etc. – i.e., the “include” files • May have to tell compiler where the library itself lives • Use Unix “man” pages to tell you about this for each system call • Other resources
Recall Parameters to main in C. main(int argc, char *argv[]) //also char *envp[] { ………………………………..} argc: Number of command line parameters (always at least 1). argv: Array of pointers to command line parameters. Each parameter is a null terminated string.
Example: % ./a.out 1 4 main(int argc, char *argv[]) { ………………………………..} argc = 3 argv points to an array with three elements, each of which is a pointer to a null terminated string.
argv “a.out” “1” “4” Example: % ./a.out 1 4
The name of the program is always contained in element 0 of argv. Ex: Want to print out name of program (inefficiently): char *ptr ; ptr = argv[0] ; while (*ptr != ‘\0’) printf(“%c”, *ptr++) ;
Exec Family of System Calls • Used to begin a processes execution. • Overwrites process (core) image of the calling process with that of called program. • Several flavors, use the one most suited to needs. • int execv( char *path, char *argvec[]) ; • int execl(const char *path, const char *arg0, ..., const char *argn, char * /* NULL*/);
exec Function calls int execv( char *path, char *argvec[]) ; pathname: Can be an executable program in your directory (application code) or a system program such as ls, cd, date, ………….. argvec: Array of pointers to NULL terminated strings. First element should always be the name of the program, last element should always be NULL.
main (int argc, *argv[]) { int my_pid ; char *args[3] ; my_pid = fork() ; if (my_pid ==0) { args[0] = “./a.out” ; All executed by args[1] = “2” ; child process args[2] = NULL; execv(“./a.out”, args) ; printf(“OOOpppssss.\n”) ; } else printf(“Not a problem!\n”) ; Executed by parent }
Program a.out will begin to execute and will have the following parameters to main: argc = 3. argv[0] = ./a.out argv[1] = “2”
Process Management System Calls • wait() Blocks parent process until all child processes have terminated • wait(pid) Blocks until a particular child process terminates. • Exit() Terminate the process and de-allocate its resources.
Very Simple Shell while(1) { type_prompt() ; read_command(command, parameters) ; if (fork() != 0) //I am the parent wait() ; else { execv(command, parameters) ; printf(“OOOPPPSSS\”) ; } }
File Management System Calls • int fd = open(name, how, mode); • “name” is pathname • Mode is file permissions. • “how” is an integer whose bits tell the system call how to open the file: O_RDONLY: read only (0) O_WRONLY: write only (1) O_RDWR: read and write (2) • int s = close(fd);
File Management System Calls • int n = read(int fd, void *buffer, int nbytes); • fd: file descriptor • buffer: destination • nbytes: how many bytes to read • n: number read, or 0 on EOF • file position is incremented • int n = write(int fd, void *buffer, int nbytes);
File Management System Calls • pos = lseek(fd,offset,whence); • “offset” and “pos” are of type off_t (on Solaris), which is really a long integer • “whence” determines what offset means: • SEEK_SET: file position is set to “offset” bytes • SEEK_CUR: file position is set to current position + “offset” • SEEK_END: file position is set to end of file + “offset” • pos: new file position
Reading from stdin • scanf (char *, &var) reads from the terminal according to format string (spaces ignored). Example: int j, k ; scanf(“%d”, &j) ; read first arg, store as int. scanf(“%d”, &k) ;// read second arg, store as int.
char x, *buf, *buf1 ; buf = (char *) malloc(1024) ; buf1 = (char *) malloc(1024) ; scanf(“%s”, buf) ; scanf(“%s”, buf1) ;