the preprocessor - cs 2022: introduction to c · 2013. 2. 12. · i resume executing other thread...
TRANSCRIPT
![Page 1: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/1.jpg)
The PreprocessorCS 2022: Introduction to C
Instructor: Hussam Abu-Libdeh
Cornell University
(based on slides by Saikat Guha)
Fall 2011, Lecture 9
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 2: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/2.jpg)
Preprocessor
I Commands to the compiler
I Include files, shortcuts, conditional compilation
I Command must start at beginning of line
Common preprocessor commands
I#include
I#define
I#ifdef / #ifndef
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 3: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/3.jpg)
#include: Header Files
I Includes files: Literally copy-paste
I Typically header files
Header FileDeclares
I External functions
I Variable types
I External global variables
Typically named *.h (or sometimes *.hpp forC++)
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 4: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/4.jpg)
#include: Header Files
mylib.h
int max(int a, int b);
mylib.c
#include "mylib.h"
int max(int a, int b) {
return (a > b ? a : b);
}
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 5: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/5.jpg)
#include: Header Files
project.c
#include "mylib.h"
void foo() {
...
m = max(p, q);
...
}
gcc -o project project.c mylib.c
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 6: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/6.jpg)
Running just the preprocessor
To see the resulting code after preprocessing:
gcc -E -o preprocessed.c project.c
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 7: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/7.jpg)
#define: MacrosBlind substitution inside file
#define malloc mymalloc
#define maxsize 100
p = malloc(maxsize);
printf("Allocated %d bytes", maxsize);
is exactly the same as
p = mymalloc(100);
printf("Allocated %d bytes", 100);
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 8: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/8.jpg)
#ifdef: Conditional compilation
project.c
#ifdef DEBUG
#include "mylib.h"
#define malloc mymalloc
#define free myfree
#endif
...
p = malloc(100);
For debugging: gcc -DDEBUG -o project project.c mylib.c
For release: gcc -o project project.c mylib.c
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 9: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/9.jpg)
#ifdef: Conditional compilation
mylib.h
void *mymalloc(int size);
void myfree(void *ptr);
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 10: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/10.jpg)
#ifdef: Conditional compilationmylib.c
#include <stdio.h>
#include <stdlib.h>
void *mymalloc(int size) {
void *ret = malloc(size);
fprintf(stderr, "Allocating: %d at %p\n", size, ret);
return ret;
}
void myfree(void *ptr) {
fprintf(stderr, "Freeing: %p\n", ptr);
free(ptr);
}
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 11: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/11.jpg)
#include: Problems
mylib1.h
#include "mylib2.h"
mylib2.h
#include "mylib1.h"
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 12: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/12.jpg)
#include: Solutionmylib1.h
#ifndef __MYLIB1_H
#define __MYLIB1_H
#include "mylib2.h"
#endif
mylib2.h
#ifndef __MYLIB2_H
#define __MYLIB2_H
#include "mylib1.h"
#endif
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 13: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/13.jpg)
#define: More useage
I Use #define to create “inline functions”I Look like functions, but are not.I Expanded by prerpocessor into code.I Makes code more readableI More e�cient than actual function call
INo function call stack frame
#define INTS(n) (int *) malloc(n * sizeof(int))
int *arr = INTS(5)
+int *arr = (int *) malloc(5 * sizeof(int))
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 14: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/14.jpg)
#define: More useage
I CAUTION: Macros get expanded “as-is”.Might cause syntax issues or unwantedprogram bugs.
#define prod(a,b) prod2(a, b * 10)
prod(5,6) ) prod2(5, 6 * 10)
prod(5,6+7) ) prod2(5, 6+7 * 10) BUG!!
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 15: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/15.jpg)
#define: Solution
#define prod(a,b) (prod2((a),(b)*10))
prod(5,6+7) ) (prod2((5),(6+7)*10))
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 16: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/16.jpg)
#define: More useage
#define oldfunc(a,b) newfunc1(a); newfunc2(b);
oldfunc(5,6) ) newfunc1(5); newfunc2(6)
for(i=0;i<5;i++) oldfunc(5,6);
) for(i=0;i<5;i++) newfunc1(5); newfunc2(6);
BUG!!
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 17: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/17.jpg)
#define: Solution
#define oldfunc(a,b) do { \
newfunc1((a)); newfunc((b)); \
} while (0)
for(i=0;i<5;i++) oldfunc(5,6);
) for(i=0;i<5;i++) do {newfunc1(5); newfunc2(6);
} while(0);
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 18: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/18.jpg)
#define: More problems
#define max(a,b) ((a) > (b) ? (a) : (b))
max(p,q) ) ((p) > (q) ? (p) : (q))
max(f1(),f2())
) ((f1()) > (f2()) ? (f1()) : (f2())) BUG!!Solution: Be extra careful when calling a function inside codethat could be a #define. Always use uppercase for macros toserve as reminder.
The Preprocessor CS 2022, Fall 2011, Lecture 9
![Page 19: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/19.jpg)
Serialization and Bit OperationsCS 2022: Introduction to C
Instructor: Hussam Abu-Libdeh
Cornell University
(based on slides by Renato Paes Leme)
Fall 2011, Lecture 10
Serialization and Bit Operations CS 2022, Fall 2011, Lecture 10
![Page 20: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/20.jpg)
Serialization
I Sending data between programsI DiskI NetworkI Pipes
I Between programs on multiple hostsI Di↵erent endiannessI Di↵erent architectures
Serialization and Bit Operations CS 2022, Fall 2011, Lecture 10
![Page 21: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/21.jpg)
Binary vs. Text
Binary. . .
I Compact
I Easy to encode/decode
I Faster
e.g. IP, TCP, AIM, . . .
Text. . .
I Easily debugged
I (Can be)self-documenting
I Arch/Endian independent
e.g. HTTP, SMTP, MSN
Serialization and Bit Operations CS 2022, Fall 2011, Lecture 10
![Page 22: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/22.jpg)
Ok, but how?
What serialization solution to use?
I tpl library
I c11n library
I Google protocol bu↵ers
I Customized solution
Which standard to use?
I XML, XDR, protocol bu↵er, ...
I Network protocol standards
Serialization and Bit Operations CS 2022, Fall 2011, Lecture 10
![Page 23: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/23.jpg)
Handling Endianness
Decimal: 3735928559Binary: 11011110101011011011111011101111
Hex: 0xdeadbeefBig Endian: 0xde 0xad 0xbe 0xefLittle Endian: 0xef 0xbe 0xad 0xde
Always in big-endian form when loaded into the CPU
Serialization and Bit Operations CS 2022, Fall 2011, Lecture 10
![Page 24: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/24.jpg)
Bit-Operations
AND-Mask (clear bits)a & b11011110101011011011111011101111 0xdeadbeef
& &00000000000000001111111100000000 0x0000FF00
= =
00000000000000001011111000000000 0x0000be00
Serialization and Bit Operations CS 2022, Fall 2011, Lecture 10
![Page 25: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/25.jpg)
Bit-Operations
OR-Mask (sets bits)a | b11011110101011011011111011101111 0xdeadbeef
| |00000000000000000101010100000000 0x00005500
= =
11011110101011011111111111101111 0xdeadFFef
Serialization and Bit Operations CS 2022, Fall 2011, Lecture 10
![Page 26: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/26.jpg)
Bit-Operations
Left-Shifta << b11011110101011011011111011101111 0xdeadbeef
<< <<8 8= =
10101101101111101110111100000000 0xadbeef00
Serialization and Bit Operations CS 2022, Fall 2011, Lecture 10
![Page 27: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/27.jpg)
Bit-Operations
Right-Shifta >> b11011110101011011011111011101111 0xdeadbeef
>> >>8 8= =
00000000110111101010110110111110 0x00deadbe1
1
for unsigned ints only. For signed ints, the instead of zero-padding,
the top-most bit is repeated
Serialization and Bit Operations CS 2022, Fall 2011, Lecture 10
![Page 28: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/28.jpg)
Bit-Operations
Compliment (flips bits)⇠a⇠11011110101011011011111011101111 ⇠0xdeadbeef
= =
00100001010100100100000100010000 0x21524110
2’s compliment representation for negative numbers:-x = ⇠x + 1
Serialization and Bit Operations CS 2022, Fall 2011, Lecture 10
![Page 29: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/29.jpg)
Serialization
I Use structures for data-types
I Copy data in one-gomemcpy(dst, src, numbytes)
I Use standard (big) endianness for multi-bytevariables
I NEVER serialize pointer values. Why?
Serialization and Bit Operations CS 2022, Fall 2011, Lecture 10
![Page 30: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/30.jpg)
Threads
CS 2022: Introduction to C
Instructor: Hussam Abu-Libdeh
Cornell University
(based on slides by Saikat Guha)
Fall 2011, Lecture 11
Threads CS 2022, Fall 2011, Lecture 11
![Page 31: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/31.jpg)
Processes vs. Threads
Processes . . .I Multiplesimultaneousprograms
I Independent memoryspace
I Independent openfile-descriptors
Threads . . .I Multiplesimultaneousfunctions
I Share the samememory
I Share the same openfile-descriptors
Threads CS 2022, Fall 2011, Lecture 11
![Page 32: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/32.jpg)
Threads Examples
I Graphical User Interfaces (GUIs)I The GUI is usually put on a separate thread from
the “app engine”I GUI remains responsive even if app blocks for
processingI Web Browser Tabs
I Each tab is managed by a separate thread forrendering
I Web pages render “simultaneously”I Note: Google Chrome actually uses a separate
process per tab
Threads CS 2022, Fall 2011, Lecture 11
![Page 33: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/33.jpg)
Threads
I One copy of the heapI One copy of the codeI Multiple stacks
Threads CS 2022, Fall 2011, Lecture 11
![Page 34: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/34.jpg)
Threads
#include <pthread.h>
void *main2(void *arg) {
...
}
void *main1(void *arg) {
...
}
int main() {
pthread_t id1, id2;
pthread_create(&id1, NULL, main1, NULL);
pthread_create(&id2, NULL, main2, NULL);
...
}
. . . think multiple processors (or cores)
Threads CS 2022, Fall 2011, Lecture 11
![Page 35: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/35.jpg)
pthread
Starting a thread
#include <pthread.h>...
pthread t id;
err = pthread create(&id, NULL, entry func, arg);
Body of a thread
void *entry func(void *arg) {...
Exiting current thread
...
pthread exit((void *)return value);
}
Threads CS 2022, Fall 2011, Lecture 11
![Page 36: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/36.jpg)
pthread
Co-operative Multi-Threading on Single Processor#include <sched.h>...
sched yield()
I Store stack pointer, internal state etc. forcurrent thread
I Restore stack pointer, internal state etc. foranother thread
I Resume executing other thread
From the caller’s perspective, sched yield() blocks until the other thread calls
sched yield(). Allows multiple threads to share the CPU cooperatively.
Threads CS 2022, Fall 2011, Lecture 11
![Page 37: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/37.jpg)
pthread
Non-Cooperative Multi-Threading
Thread library (pthread) pre-empts thread when itinvokes an OS function.
I Almost transparent when writing codeI Whole new class of bugs: Concurrency bugs
I Multiple threads accessing same objectconcurrently
I Solution: Locks – only one thread can grab lockI More of this is CS414/415
Threads CS 2022, Fall 2011, Lecture 11
![Page 38: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/38.jpg)
Goto, Exceptions, and Assembly in
C
CS 2022: Introduction to C
Instructor: Hussam Abu-Libdeh
Cornell University
(based on slides by Saikat Guha)
Fall 2011, Lecture 12
Goto, Exceptions, and Assembly in C CS 2022, Fall 2011, Lecture 12
![Page 39: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/39.jpg)
Switch Statement
I N-way if (N > 2), but equality check onlyI Only integers
I But then many things in C are glorified integersI Notably, enums
Goto, Exceptions, and Assembly in C CS 2022, Fall 2011, Lecture 12
![Page 40: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/40.jpg)
Switch Statement
enum days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
...
enum days day = ...;
switch (day) {
case Sat:
...
break;
case Sun:
...
break;
case Mon:
printf("Sounds like someone has a case of the Mondays.\n");
case Wed:
case Fri:
...
break;
default:
...
}
Goto, Exceptions, and Assembly in C CS 2022, Fall 2011, Lecture 12
![Page 41: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/41.jpg)
Goto
I Unstructured control flowI (unlike if, switch, for etc.)
I EvilI Except when it’s notI Especially, when it is the cleanest
Goto, Exceptions, and Assembly in C CS 2022, Fall 2011, Lecture 12
![Page 42: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/42.jpg)
Goto
...
goto foo;
...
foo:
...
Goto, Exceptions, and Assembly in C CS 2022, Fall 2011, Lecture 12
![Page 43: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/43.jpg)
Goto
Extremely useful forI breaking out of deeply nested loopsI handling errors and exceptions
I by writing code that cleans up resources in reverseorder of allocation
I and jumping to the correct position in the list ifallocation fails at some point
Goto, Exceptions, and Assembly in C CS 2022, Fall 2011, Lecture 12
![Page 44: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/44.jpg)
Exceptions (kinda)
I To break out of a deep call stack quicklyI Think goto breaking out of deep loops, butapplied to function calls
I setjmp and longjmp
Goto, Exceptions, and Assembly in C CS 2022, Fall 2011, Lecture 12
![Page 45: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/45.jpg)
Inline Assembly
I For when no C statement exists for the taskI Or when the compiler isn’t generating theassembly you want
asm("...assembly code..."); // Basic form
asm("code" : output); // Assembly -> C
asm("code" : ... : input); // C -> C
For more info check out:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
Goto, Exceptions, and Assembly in C CS 2022, Fall 2011, Lecture 12
![Page 46: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/46.jpg)
Course RecapCS 2022: Introduction to C
Instructor: Hussam Abu-Libdeh
Cornell University
(based on slides by Saikat Guha)
Fall 2011, Lecture 13
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 47: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/47.jpg)
Hello World!#include <stdio.h>
void print_greeting(){
printf("Hello World!\n");}
int main(int argc, char **argv){
print_greeting();return 0;
}
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 48: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/48.jpg)
Command Line Arguments
I When an application launches, the operatingsystem can pass it command line arguments
I Optional and not requiredI int main(int argc, char **argv)
I argc - arguments countI argv - array of arguments as stringsI application name counted as an argument, so argc
is at least 1
I int main() is also valid if you don’t careabout command line arguments
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 49: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/49.jpg)
Data Types 1/3 (Primitives)
I int - integer (size is platform dependent)I int32 t - 32-bit integer on all platformsI float - floating point numberI char - characterI int[10] - array of 10 integersI char[10] - array of 10 characters (a string)I ...
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 50: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/50.jpg)
Data Types 2/3 (structs)struct person
{
char[20] name;
int age;
char[256] address;
};
I struct types hold collections of elementsI struct person (both words together) is nowa “data type”
I Declare variables as such:struct person john doe;
I the ‘.‘ operator is used to access struct membersjohn doe.age
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 51: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/51.jpg)
Data Types 3/3 (Pointers)
I Pointers are variables whose contents areinterpreted as the memory addresses of othervariables
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 52: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/52.jpg)
Data Types 3/3 (Pointers)
I Pointers are variables whose contents areinterpreted as the memory addresses of othervariables
I int *value;struct person *john doe;
I Operators relating to pointersI * - dereference: follow pointer and read data valueI & - address of : get address of a variable (usually to
store in pointer)I -> - access element: access elements of a struct
pointer. Equivalent to (* ).
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 53: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/53.jpg)
Memory
I StackI memory allocated statically by compilerI memory released back to system automatically
after function returnsI Heap
I memory allocated dynamically by programmer atrun-time
I memory has to be released back to system (freed)manually by programmer
I use malloc( size ) and free( pointer ) toallocate and free memory
Iint *ptr = (int *) malloc(sizeof(int));
free(ptr);
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 54: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/54.jpg)
Frequently Used Libraries
I stdio.h - provides printf, scanf, fgets andother input/output functions
I stdlib.h - provides malloc and freefunctions
I string.h - provides strcmp, strcpy andother string manipulation functions
I stdint.h - provides int32 t, uint32 t,int64 t, uint64 t and other fixed sizeintegers
Remember to include the correct library when usingsomething provided by it!
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 55: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/55.jpg)
DebuggingI Debugging is extremely valuable to determinewhat is going wrong with your program
I GDB is an interactive command line debuggerI break <function name or line number> -
sets a break point at a function def. or a line #I print <variable name or expression> -
prints the value of a variable or an expression onprogram variables
I run <command line arguments> -starts running the program with the givencommand line arguments
I help - find help on more commands
I Compile your code with the -g flag for gcc tobe able to debug the program with gdb
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 56: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/56.jpg)
Terminal Input/Output
I Output to screenI printf("Hi %d", 5); - print formatted textI puts("Hello World!"); - print a string
I Input from keyboardI gets(buffer_array); - read a single line from
stdin into the buffer arrayI fgets(buf, 128, stdin); - read a single line or
at most 128 characters from stdin into bufI scanf("%s %d", buf, &i); - read from stdin
and “parse” input according to given format
Many more variants that work with any stream type(for example good for file I/O)
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 57: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/57.jpg)
File I/O
Opening and closing filesint fd; // File Descriptorfd = open("/path/to/file", O RDWR | O CREAT);close(fd);
Reading and Writingchar buf[4096]; int len;len = read(fd, buf, 4096)len = write(fd, buf, 4096);
WARNING: Size passed is only a suggestion. May read/write fewer than requested
number of bytes. Return value is number of bytes actually read/written. MUST retry
if not fully read/written.
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 58: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/58.jpg)
Network I/O
Opening and closing network socketsint sock; // File Descriptorsock = socket(PF INET, SOCK STREAM, IPPROTO TCP);close(sock);
Internet Addressesstruct sockaddr in addr;addr.sin family = AF INET;addr.sin addr.s addr = htonl(0x7F000001);addr.sin port = htons(8080);
Fill the address info manually or get the infoautomatically with getaddrinfo().See man getaddrinfo
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 59: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/59.jpg)
Bitwise Operations
I Manipulate individual bits in a variableI Useful for many things, one of which isserialization
I OperatorsI a & b - bitwise ANDI a | b - bitwise ORI a ^ b - bitwise XORI ~a - bitwise one’s complementI a << b - bitwise shift leftI a >> b - bitwise shift right
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 60: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/60.jpg)
Threads
Starting a thread#include <pthread.h>...
pthread t id;
err = pthread create(&id, NULL, entry func, arg);
Body of a threadvoid *entry func(void *arg) {
...
Exiting current thread...
pthread exit((void *)return value);
}
Course Recap CS 2022, Fall 2011, Lecture 13
![Page 61: The Preprocessor - CS 2022: Introduction to C · 2013. 2. 12. · I Resume executing other thread From the caller’s perspective, sched yield() blocks until the other thread calls](https://reader035.vdocuments.net/reader035/viewer/2022071013/5fcb9ead5a5b9a2b6753e40f/html5/thumbnails/61.jpg)
Resources
I Dave’s programming in C tutorials:http://www.cs.cf.ac.uk/Dave/C/CE.html
I Linux manual pagesman pthread createman stdlib.h
I also available online at http://linux.die.net/
I Search online!Plenty of resources and tutorials online
Course Recap CS 2022, Fall 2011, Lecture 13