1 / 39

CS222

Week 5 - Wednesday. CS222. Last time. What did we talk about last time? Arrays. Questions?. Project 2 . Quotes. Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter. Eric S. Raymond. Files.

miller
Download Presentation

CS222

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Week 5 - Wednesday CS222

  2. Last time • What did we talk about last time? • Arrays

  3. Questions?

  4. Project 2

  5. Quotes Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter. Eric S. Raymond

  6. Files

  7. Files • There are regular files in Linux which you can further break down into data files and executables (although Linux treats them the same) • A directory is a special kind of file that lists other files • Links in Linux are kind of like shortcuts in Windows • There are hard links and soft links (or symbolic links) • File names can be up to 255 characters long • Can contain any ASCII characters except / and the null character \0 • For readability and compatibility, they should only use letters, digits, the hyphen, underscore, and dot • Pathnames describe a location of a file • They can start with / making them absolute paths • Or they are relative paths with respect to the current working directory

  8. File permissions • Every file has a UID and GID specifying the user who owns the file and the group the file belongs to • For each file, permissions are set that specify: • Whether the owner can read, write, or execute it • Whether other members of the group can read, write, or execute it • Whether anyone else on the system can read, write, or execute it • The chmod command changes these settings (u is for owner, g is for group, and o is everyone else)

  9. File I/O • All I/O operations in Linux are treated like file I/O • Printing to the screen is writing to a special file called stdout • Reading from the keyboard is reading from a special file called stdin • When we get the basic functions needed to open, read, and write files, we'll be able to do almost any kind of I/O

  10. Processes • A process is a program that is currently executing • In memory, processes have the following segments: • Text The executable code • Data Static variables • Heap Dynamically allocated variables • Stack Area that grows and shrinks with function calls • A segmentation fault is when your code tries to access a segment it's not supposed to • A process generally executes with the same privileges as the user who started it

  11. System calls • A system call is a way to ask the kernel to do something • Since a lot of interesting things can only be done by the kernel, system calls must be provided to programmers via an API • When making a system call, the processor changes from user mode to kernel mode • There is a fixed number of system calls defined for a given system

  12. glibc • The most common implementation of the Standard C Library is the GNU C Library or glibc • Some of the functions in the glibc perform systems calls and some do not • There are slight differences between the versions of the glibc • Microsoft also has an implementation of the Standard C Library that doesn't always behave the same

  13. Handling system errors • There are no exceptions in C • Instead, when a system call fails, it usually returns -1 • To find out why the system call failed • First, make sure you #include <errno.h> • Then check the value of the integer errno in your program after the system call fails • Use the man pages to determine what a given value of errno means • The perror() function is often used to print errors instead of printf() • It sends the output to stderr instead of stdout

  14. Error handling example #include<stdio.h> #include<fcntl.h> #include<errno.h> int main() { intfd= open("eggplant.txt", O_WRONLY | O_CREAT | O_EXCL); if(fd == -1) { perror("Failure to create file: "); if( errno == EACCES ) perror("Insufficient privileges\n"); else if( errno == EEXIST ) perror("File already exists\n"); else perror("Unknown error\n"); exit(EXIT_FAILURE); } return 0; }

  15. System types • C has a feature called typedef which allows a user to give a new name to a type • System types are often created so that code is portable across different systems • The most common example is size_t, which is the type that specifies length • It's usually the same as unsigned int • There are named types for process IDs (pid_t), group IDs (gid_t), user IDs (uid_t), time (time_t), and many others

  16. Scope

  17. Scope • The scope of a name is the part of the program where that name is visible • In Java, scope could get complex • Local variables, class variables, member variables, • Inner classes • Static vs. non-static • Visibility issues with public, private, protected, and default • C is simpler • Local variables • Global variables

  18. Local scope • Local variables and function arguments are in scope for the life of the function call • They are also called automatic variables • They come into existence on the stack on a function call • Then disappear when the function returns • Local variables can hide global variables

  19. Global scope • Variables declared outside of any function are global variables • They exist for the life of the program • You can keep data inside global variables between function calls • They are similar to static members in Java intvalue; void change() { value = 7; } intmain() { value = 5; change(); printf("Value: %d\n", value); return 0; }

  20. Use of global variables • Global variables should rarely be used • Multiple functions can write to them, allowing inconsistent values • Local variables can hide global variables, leading programmers to think they are changing a variable other than the one they are • Code is much easier to understand if it is based on input values going into a function and output values getting returned

  21. Hiding • If there are multiple variables with the same name, the one declared in the current block will be used • If there is no such variable declared in the current block, the compiler will look outward one block at a time until it finds it • Multiple variables can have the same name if they are declared at different scope levels • When an inner variable is used instead of an outer variable with the same name, it hides or shadows the outer variable • Global variables are used only when nothing else matches • Minimize variable hiding to avoid confusion

  22. extern declarations • What if you want to use a global variable declared in another file? • No problem, just put extern before the variable declaration in your file • There should only be one true declaration, but there can be many extern declarations referencing it • Function prototypes are implicitly extern file2.c file1.c file3.c program.c

  23. static declarations • The static keyword causes confusion in Java because it means a couple of different (but related) things • In C, the static keyword is used differently, but also for two confusing things • Global static declarations • Local static declarations

  24. Global static variables • When the static modifier is applied to a global variable, that variable cannot be accessed in other files • A global static variable cannot be referred to as an extern in some other file • If multiple files use the same global variable, each variable must be static or an extern referring to a single real variable • Otherwise, the linker will complain that it's got variables with the same name

  25. Local static variables • You can also declare a static variable local to a function • These variables exist for the lifetime of the program, but are only visible inside the method • Some people use these for bizarre tricks in recursive functions • Try not to use them! • Like all global variables, they make code harder to reason about • They are not thread safe

  26. Local staticexample #include <stdio.h> void unexpected() { static intcount = 0; count++; printf("Count: %d", count); } intmain() { unexpected(); //Count: 1 unexpected(); //Count: 2 unexpected(); //Count: 3 return 0; }

  27. Strings

  28. There are no strings in C • Unfortunately, C does not recognize strings as a type • A string in C an array of char values, ending with the null character • Both parts are important • It's an array of char values which can be accessed like anything else in an array • Because we don't know how long a string is, we mark the end with the null character

  29. Null character • What is the null character? • It is the very first char in the ASCII table and has value 0 (zero) • It is unprintable • You can write it • as a char: '\0' • as an int: 0 • as a constant: NULL • It is not the same as EOF (which is -1 as an int value) • If you allocate memory for a string, you need enough for the length plus one extra for the null

  30. String literals • A string literal ("yo, yo, yo!") in C is a char array somewhere in memory • It is read-only memory with global scope • Maybe it's in the Global or BSS segment (or even some even more obscure segment) • You can throw a string literal into an array: • Doing so is exactly like doing the following: char word[] = "wombat"; char word[] = {'w','o','m','b','a','t','\0'};

  31. Using printf() • You can print out another string using printf() • Even printf() is only looking until it hits a null character • What would happen in the following scenario? printf("The word of the week is: \"%s.\"\n", "exiguous"); char letters[5]; inti = 0; for(i = 0; i < 5; i++ ) letters[i] = 'A'; printf("The word of the week is: \"%s.\"\n", letters);

  32. Practice • Write a function that finds the length of a string • Write a function that reverses a string • First you have to find the null character

  33. String functions

  34. String library • To use the C string library • #include <string.h> • There are a few more functions tied to memory copying and finding the last rather than the first occurrence of something • There is also a string tokenizer which works something like the split() method in Java • It's much harder to use • Functions in the string library go until they hit a null character • They make no guarantees about staying within memory bounds

  35. String operations • They're all done with the string library! • Remember that strings are arrays • There is no concatenation with + • There is no equality with == • You can compare using == without getting a warning, but it is meaningless to do so • You cannot assign one string to another with = because they are arrays • You will eventually be able to do something similar with pointers

  36. Quiz

  37. Upcoming

  38. Next time… • Review for Exam 1 • Lab 5

  39. Reminders • Keep reading K&R chapter 5 • Finish Project 2 • Due Friday • Exam 1 next Monday

More Related