csci-2500, fall 2012 -- c programming and intro to linux 1 unit1 c programming and intro to linux a...

186
CSCI-2500, Fall 2012 -- C Programming and Intro to Linux 1 Unit1 C Programming and Intro to Linux A crash course for C++/Windows Users

Upload: austen-foster

Post on 16-Dec-2015

226 views

Category:

Documents


1 download

TRANSCRIPT

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

1

Unit1C Programming and Intro to

Linux

A crash course for C++/Windows Users

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

2

C vs. C++: Differences

• C does not have classes/objects!– all code is in functions (subroutines).

• C structures can not have methods

• C I/O is based on library functions:– printf, scanf, fopen, fclose, fread, fwrite,

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

3

C vs. C++: Differences (cont.)

• C does not support any function overloading (you can’t have 2 functions with the same name).

• C does not have new or delete, you use malloc() and free() library functions to handle dynamic memory allocation/deallocation.

• C does not have reference variables

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

4

C vs. C++: Similarities

• Built-in data types: int, double, char, etc.

• Preprocessor (handles #include, #define, etc.)

• Control structures: if, while, do, for, etc.

• Operators: + - * / = == != < > += ++ etc.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

5

C vs. C++: Similarities (cont.)

• There must be a function named main().

• function definitions are done the same way.

• Can split code in to files (object modules) and link modules together.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

6

Evolution of C

• Traditional C: 1978 by K&R• Standard C: 1989 (aka ANSI C)• Standard C: 1995, amendments to

C89 standard• Standard C: 1999, is the new

definitive C standard replace all the others.

• GCC is a C99 compliant compiler (mostly, I think :-)).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

7

Standard C (C89)

• The addition of truly standard library– libc.a, libm.a, etc.

• New processor commands and features• Function prototypes -- arg types specified

in the function dec.• New keywords: const, volatile, signed• Wide chars, wide strings and multibyte

characters.• Clarifications to conversion rules,

declarations and type checking

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

8

Standard C (C95)

• 3 new std lib headers: iso646.h, wctype.h and wchar.h

• New formatting codes for printf/scanf• A large number of new functions.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

9

Standard C (C99)

• Complex arithmetic• Extensions to integer types, including

the longer standard type (long long, long double)

• Boolean type (stdbool.h)• Improved support for floating-point

types, including math functions for all types

• C++ style comments (//)

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

10

Simple C Program

#include <stdio.h>

int main(void) {

printf(“Hello World\n”);

return(0);

}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

11

Another Program

#include <stdio.h>

void printhello(int n) {int i;for (i=0;i<n;i++)

printf(“Hello World\n”);}

void main() {printhello(5);

}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

12

Typical C Program

includes #include <stdio.h>#include <stdlib.h>

#define MAX 1000

typedef char bigstring[MAX];

char *reverse( char *s) { char buf[MAX]; int i,len; len = strlen(s); printf("reversing %s\n",s); for (i=0;i<len;i++) buf[i] = s[len-i-1]; buf[i]='\0'; strcpy(s,buf); return(s);}

void main(int argc,char **argv) { if (argc<2) { printf("Invalid usage - must supply a string\n"); exit(0); } printf("%s\n",reverse(argv[1]));}

defines, data type definitions, global variable declarations

function definitions

main()

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

13

A Real C Example Program

• Program that accepts one command line argument.

• Treats the command line argument as a string, and reverses the letters in the string.

• Prints out the result (the reversed string).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

14

reverse.c - part 1

#include <stdio.h> /* printf */#include <stdlib.h> /* malloc,free */

/* MAX is the size of the largest string we can handle */

#define MAX 1000

/* bigstring is a new data type */typedef char bigstring[MAX];

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

15

reverse.c - part 2/* reverses a string in place returns a pointer to the string*/char *reverse( char *s) { bigstring buf; /* big so no BOA */ int i,len; len = strlen(s); /* find the length */ for (i=0;i<len;i++) buf[i] = s[len-i-1]; buf[i]='\0'; /* null terminate!*/ strcpy(s,buf); /* put back in to s */ return(s);}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

16

reverse.c - part 3

void main(int argc,char **argv) { if (argc<2) { printf("Invalid usage - must supply a string\n");

exit(0); } printf("%s\n",reverse(argv[1]));}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

17

Using dynamic allocationchar *reverse( char *s) { char *buf; int i,len; len = strlen(s);

/* allocate memory len + 1 for null term */ buf = (char *)malloc(len+1); for (i=0;i<len;i++) buf[i] = s[len-i-1]; buf[i]='\0'; strcpy(s,buf); free(buf); return(s);}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

18

Compiling on Unix

Traditionally the name of the C compiler that comes with Unix is “cc”.

We can use the Gnu compiler named “gcc”.

gcc –Wall –o reverse reverse.c

tells the compiler tocreate executable file with the name reverse

tells the compilerthe name of the inputfile.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

19

Running the program

>./reverse hidrc

crdih

>./reverse This is a long string

sihT

>./reverse “This is a long string”

gnirts gnol a si sihT

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

20

C Libraries• Standard I/O: printf, scanf, fopen, fread, …

• String functions: strcpy, strspn, strtok, …

• Math: sin, cos, sqrt, exp, abs, pow, log,…

• System Calls: fork, exec, signal, kill, …

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

21

Quick I/O Primer - printf

int printf( const char *, . . . );

. . . means “variable number of arguments”.

The first argument is required (a string).

Given a simple string, printf just prints the string (to standard output).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

22

Simple printf

printf(“Hi Dr. C. – I am a string\n”);

printf(“I\thave\ttabs\n”);

char s[100];

strcpy(s,”printf is fun!\n”);

printf(s);

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

23

arguing with printf

You can tell printf to embed some values in the string – these values are determined at run-time.

printf(“here is an integer: %d\n”,i);

the %d is replaced by the value of the argument following the string (in this case i).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

24

More integer arguments

printf(“%d + %d = %d\n”,x,y,x+y);

for (j=99;j>=0;j--)

printf(“%d bottles of beer on the wall\n”, j);

printf(“%d is my favorite number\n”,17);

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

25

Printf needs to be told type explicit information!!

• %d is replaced by the value of the parameter when treated as a integer.

• If you give printf something that is not an integer – it doesn’t know!

printf("Print an int %d\n","Hi Dr. C.");

Print an int 134513884

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

26

Other formats

• %d is a format – it means “treat the parameter as a signed integer”

• %u means unsigned integer• %x means print as hexadecimal• %s means “treat it as a string”• %c is for characters (char)• %f is for floating point numbers• %% means print a single ‘%’

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

27

Fun with printf

char *s = "Hi Dr. C";

printf("The string \"%s\" is %d characters long\n",

s,strlen(s));

printf("The square root of 10 is %f\n",sqrt(10));

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

28

Controlling the output

• There are formatting options that you can use to control field width, precision, etc.

printf(“The square root of 10 is %20.15f\n”,sqrt(10));

The square root of 10 is 3.162277660168380

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

29

Lining things up

int i;

for (i=1;i<5;i++)

printf("%2d %f %20.15f\n",

i,sqrt(i),sqrt(i));

1 1.000000 1.000000000000000

2 1.414214 1.414213562373095

3 1.732051 1.732050807568877

4 2.000000 2.000000000000000

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

30

Alas, we must move on

• There are more formats and format options for printf.

• The man page for printf includes a complete description (any decent C book will also).

• NOTE: to view the man page for printf you should type the following: man 3 printf

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

31

Input - scanf

• scanf provides input from standard input.

• scanf is every bit as fun as printf!• scanf is a little scary, you need to

use pointers Please NOOOOOOOOOOOO

Not Pointers!• Actually, you don’t really need

pointers, just addresses.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

32

Remember Memory?• Every C variable is stored in memory.

• Every memory location has an address.

• In C you can use variables called pointers to refer to variables by their address in memory.

• NO C++ “referents” allowed in ANSI C.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

33

scanf

int scanf(const char *format, ...);

• Remember “. . .” means “variable number of arguments” (good thing you have a memory).

• Looks kinda like printf

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

34

What scanf does

• Uses format string to determine what kind of variable(s) it should read.

• The arguments are the addresses of the variables.

• The & operator here means “Take the address of”:

int x, y;

scanf(“%d %d”,&x,&y);

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

35

A simple example of scanf

float x;

printf("Enter a number\n");

scanf("%f",&x);

printf("The square root of %f is %f\n“,x,sqrt(x));

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

36

scanf and strings

Using %s in a scanf string tells scanf to read the next word from input – NOT a line of input:

char s[100]; // ALLOC SPACE!!

printf("Type in your name\n");

scanf("%s",s); // note: s is a char *

printf("Your name is %s\n",s);

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

37

man scanf

• Check out the man page for more details.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

38

Reading a line

• You can use the function fgets to read an entire line:

char *fgets(char *s, int size,

FILE *stream);

size is the maximum # charsFILE is a file handle

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

39

Using fgets to read from stdin

char s[101];

printf("Type in your name\n");

fgets(s,100,stdin);

printf("Your name is %s\n",s);

Note: use sscanf to parse the input from fgets

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

40

Other I/O stuff

• fopen,fclose

• fscanf, fprintf, fgets

• fread, fwrite

• Check the man pages for the details.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

41

String functions

char *strcpy(char *dest,

const char *src);

size_t strlen(const char *s);

char *strtok(char *s,

const char *delim);

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

42

Math library

• The math library is often provided as a external library (not as part of the standard C library).

• You must tell the compiler you want the math library:

gcc –o myprog myprog.c -lm

means “add in the math library”

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

43

Useful Predefined MACROS

• __LINE__ : line # in source code file (%d)• __FILE__ : name of current source code

file (%s) • __DATE__ : date “Mmm dd yyy” (%s)• __TIME__ : time of day, “hh:mm:ss” (%s)• __STDC_ : 1 if compiler is ISO compliant• __STDC_VERSION__ : integer (%s)

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

44

Editors: Vi(m), Emacs or Pico/Nano

• Emacs – it more than an editor, it’s a full-on environment. Steep learning curve, but yields the grestest productivity for most developers.

• Vi – the grandfather of editors. Small memory foot print.

• Pico/Nano – easy to use but lacks a lot of advanced features developers want.

• Let’s do some examples…

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

45

Review: C is a “subset” of C++

• Primary difference is the C has nothing todo with classes.– no constructors– no destructors– no inheritance– no operator overloading– no new or delete operator – memory allocated via

system calls– no templates (no STL)– no String or Boolean (C89) types only base types: char,

short, int, float, and double

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

46

O-O still possible with C

• Keyword struct is used to declare a record or “methodless” class, likestruct Student

{char first_name[32];char last_name[32];unsigned int id;double gpa;};

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

47

Using a struct

int main(){struct Student Suzy;/* init data members by hand *//* strcpy is a standard libC function */strcpy( Suzy.last_name, “Chapstick”);Suzy.id = 12345;}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

48

Variable Declarationsint main()

{struct Student Suzy;strcpy( Suzy.last_name, “Chapstick”);int i; /* WRONG!! */struct Student Sam; /* WRONG !*/Suszy.id = 12345;}

All vars must be declared before the first executable statment in a function or block.

This has a significant impact on your “for” loops!

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

49

“for” Loops in C

• In C++ you will typically do:– for( int i=0; i < num; i++ )

• In C you MUST do:– int i; /* top of scope */– for( i = 0; i < num; i++ )– note, “i” exists outside of the for loop

scope!

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

50

Comments in C

• The GNU C/C++ compiler will support../* this is a comment */// this is a comment as well/*this is a comment also *//* this is a comment too*/

• nested comments are not allowed in GNU C/C++ compiler

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

51

Memory Allocation

• Use C system calls:– void *malloc(size_t size) returns a pointer to

a chunk of memory which is the size in bytes requested

– void *calloc(size_t nmemb, size_t size) same as malloc but puts zeros in all bytes and asks for the number of elements and size of an element.

– void free(void *ptr) deallocates a chunk of memory. Acts much like the delete operator.

– void *realloc(void *ptr, size_t size) changes the size of the memory chunk point to by ptr to size bytes.

– prototypes found in the stdlib.h header file.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

52

Example Memory Allocation

void main() {

char *cptr;double *dblptr;struct Student *stuptr;/* equiv to cptr = new char[100]; */cptr = (char *) malloc(100);/* equiv to dlbptr = new double[100]; */dblptr = (double *) malloc(sizeof(double) * 100);/* equiv to stuptr = new Student[100]; */stuptr = (struct Student *) malloc( sizeof( struct Student) * 100);

}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

53

Input & Output• Cannot use << , >>, cout, or cin in C.• Instead use scanf for input and printf output.• These system calls take a variable number of

arguments.– first argument is format string– remaining args are variables to write from in printf or

read into for scanf.– printf format string, all characters are printed

themselves except those following a %, which means substitute the value of the next argument here and treat as a particular type as determined by the characters following the %.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

54

Special Format Characters

• printf– %d: signed integer– %lld: signed long long integer (64 bits)– %u: unsigned integer– %x: integer in hexadecimal format– %f: double– %Lf: long double– %s – a string

• scanf is the same except that %f is for float and %lf is a double

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

55

I/O Examples

• printf:– printf(“Hello World! \n”);– printf(“X = %u \n”, x);– printf(“X = %u, Y = %f and Z = %s \n”, x,y,z);

• scanf– scanf(“%d”, &i);– scanf(“%d %d %d”, &i, &j, &k);– scanf(“%lf”, &my_double);

• prototypes found in stdio.h header file.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

56

Fun with printf

• Can you write a C program whose output is itself??

• Let take a look at some, but a bit later..

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

57

Well Used Header Files(based on Linux)

• stdio.h – printf/scanf/ FILE type• stdlib.h – convert routines like string-to-

XX, (strtol, strtod, stro), rand num gen, calloc and malloc

• unistd.h – system calls like fork, exec, read, write

• math.h/float.h – math routines• errno.h – standard error numbers for

return values and error handling routines like perror, system call numbers (in Linux).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

58

C only passes arguments by value!

• In C++ you can do the following:void square_it( int &x ){x = x * x; // in calling scope x is now x^2}

• In C you MUST do:void square_it( int *x )

{*x = (*x ) * (*x); // caller must pass a pointer to var!!}

• Thus, you must be GOOD at POINTERS• You will get even better when you write

assembly language code!!

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

59

Pointers, Arrays & Memory Addresses

• What is the difference between:char array[4][4];

• andchar **array;int i;array = (char **)malloc(4 * sizeof(char *));for( i = 0; i < 4; i++ )

array[i] = (char *)malloc(4);• Is &array[2][2] the same in both cases??• Note, & operator is only to take the address

of a variable (i.e., symbol in a program).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

60

Memory• a linear series of address starting a zero• addressed in 32 or 64 bit chunks called

words

word Nbyte 0

word Nbyte 1

word Nbyte 2

word Nbyte 3

word 1byte 0

word 1byte 1

word 1byte 2

word 1byte 3

word 0byte 0

word 0byte 1

word 0byte 2

word 0byte 3

•byte order is Big-endian

•could be Little-endian (i.e., 3,2,1,0)

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

61

Arrays: char a[4][4]

a[3][0]addr 12

a[3][1]addr 13

a[3][2]addr 14

a[3][3]addr 15

a[2][0]addr 8

a[2][1]addr 9

a[2][2]addr 10

a[2][3]addr 11

a[1][0]addr 4

a[1][1]addr 5

a[1][2]addr 6

a[1][3]addr 7

a[0][0]addr 0

a[0][1]addr 1

a[0][2]addr 2

a[0][3]addr 3

symbol “a” or

a[0][0] starts here

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

62

Pointers: char **a• here the first layer is an array of pointers• each pointer then points to a string or char *.

a[3]

a[2]

a[1]

a[0]

a[3][0] a[3][1] a[3][2] a[3][3]

a[2][0] a[2][1] a[2][2] a[2][3]

a[1][0] a[1][1] a[1][2] a[1][3]

a[0][0] a[0][1] a[0][2] a[0][3]

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

63

Dynamic Arrays

a[3]

a[2]

a[1]

a[0]

a[3][0]

a[2][0] a[2][1] a[2][2]

a[1][0] a[1][0] a[1][2] a[1][3]

a[0][0] a[0][1]

• each “row” can have an independent number of elments from the other rows.

• implemented a an char ** data structure

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

64

File I/O Operations

• fopen -- opens a file• fclose -- close a file• fprintf -- “printf” to a file.• fscanf -- read input from a file.• ...and many other routines..

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

65

fopen#include<stdio.h>void main()

{FILE *myfile;myfile = fopen( “myfile.txt”, “w ”);

}• 2nd arg is mode:

– w -- create/truncate file for writing– w+ -- create/truncate for writing and

reading– r -- open for reading– r+ -- open for reading and writing

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

66

fclose#include<stdio.h>#include<errno.h>void main()

{FILE *myfile;if( NULL == (myfile = fopen( “myfile.txt”,

“w ”))){perror(“fopen failed in main”);exit(-1);}

fclose( myfile );/* could check for error here, but usually

not needed */}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

67

fscanf#include<stdio.h>#include<errno.h>void main()

{FILE *myfile;int i, j, k;char buffer[80];if( NULL == (myfile = fopen( “myfile.txt”, “w ”)))

{perror(“fopen failed in main”);exit(-1);}

fscanf( myfile, “%d %d %d %s”, &i, &j, &k, buffer);fclose( myfile );/* could check for error here, but usually not needed */

}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

68

sscanf#include<stdio.h>#include<errno.h>void main()

{FILE *myfile;int i, j, k;char buffer[1024];

char name[80];if( NULL == (myfile = fopen( “myfile.txt”, “w ”)))

{perror(“fopen failed in main”);exit(-1);}

fgets( buffer, 1024, myfile );sscanf( buffer, “%d %d %d %s”, &i, &j, &k, name);fclose( myfile );/* could check for error here, but usually not needed */

}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

69

fprintf#include<stdio.h>#include<errno.h>void main()

{FILE *myfile;int i, j, k;char buffer[80];if( NULL == (myfile = fopen( “myfile.txt”, “r+”)))

{perror(“fopen failed in main”);exit(-1);}

fscanf( myfile, “%d %d %d %s”, &i, &j, &k, buffer);fprintf( myfile, “%d %d %d %s”, i, j, k, buffer );fclose( myfile );/* could check for error here, but usually not needed */

}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

70

Function Pointers!

• Guess what “code” is really just “data”!– Jon Von Neumann’s idea of the Stored Program

Computer is still with us today...50 years later• A computer program is divided largely into

3 areas or segments.– text or code segment– heap (static/global and dynamic memory)– stack (where your local variables are stored

• C/C++ supports the ability to have a pointer that points to a function that is in the text segment of a program.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

71

Typical Program Segments

TEXT/CODE

HEAP

STACK•Stack will typically grow down (in memory address) towards the Heap

•Heap will grow up towards Stack

•Text generally does not change except when dynamic classes or libs being loaded

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

72

Function Pointer Syntax

/* declare a function pointer type */typedef int (*function_pointer_t)( int );int square_it( int x) {return x*x;}int main() {

function_pointer_t sq_it_ptr=NULL;sq_it_ptr = (function_ptr_t) &square_it;return sq_it_ptr( 2 );

}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

73

Hacking your Stack!• If “code” is really “data”, then can you copy it?

– answer: (left blank to see if you attended lecture)

• Can you modify or “write” to your text segment?– memory protection in Unix/Linux prevents this.– will talk more about later.

• But nothing prevents us from running code off the stack!– Well actually modern systems have a “no execute” bit on

the stack segment of memory – e.g, x86_64 procs

• Let’s look at a real example!– see online examples for a copy of “stack-hack.c”

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

74

Crash Course in Unix

For more info check out the Unix man pages

-or-Unix in a Nutshell (an O’Reilly book).

-or-Linux User’s Guide from class webpage

-or-www.redhat.com

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

75

Unix Accounts

• To access a Unix system you need to have an account.

• Unix account includes:– username and password– userid and groupid– home directory– shell

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

76

username• A username is (typically) a sequence of

alphanumeric characters of length no more than 8.

• username is the primary identifying attribute of your account.

• username is (usually) used as an email address

• the name of your home directory is usually related to your username.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

77

password• a password is a secret string that only the

user knows (not even the system knows!)• When you enter your password the

system encrypts it and compares to a stored string.

• passwords are (usually) no more than 8 characters long.

• It's a good idea to include numbers and/or special characters (don't use an english word!)

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

78

userid

• a userid is a number (an integer) that identifies a Unix account. Each userid is unique.

• It's easier (and more efficient) for the system to use a number than a string like the username.

• You don't need to know your userid!

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

79

Unix Groups and groupid

• Unix includes the notion of a "group" of users.

• A Unix group can share files and active processes.

• Each account is assigned a "primary" group.

• The groupid is a number that corresponds to this primary group.

• A single account can belong to many groups (but has only one primary group).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

80

Home Directory

• A home directory is a place in the file system where files related to an account are stored.

• A directory is like a Windows folder (more on this later).

• Many unix commands and applications make use of the account home directory (as a place to look for customization files).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

81

Shell

• A Shell is a unix program that provides an interactive session - a text-based user interface.

• When you log in to a Unix system, the program you initially interact with is your shell.

• There are a number of popular shells that are available.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

82

Logging In

• To log in to a Unix machine you can either:– sit at the console (the computer itself)– access via the net (using telnet, rsh, ssh,

kermit, or some other remote access client).

• The system prompts you for your username and password.

• Usernames and passwords are case sensitive!

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

83

Session Startup

• Once you log in, your shell will be started and it will display a prompt.

• When the shell is started it looks in your home directory for some customization files.– You can change the shell prompt, your

PATH, and a bunch of other things by creating customization files.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

84

Your Home Directory

• Every Unix process* has a notion of the “current working directory”.

• You shell (which is a process) starts with the current working directory set to your home directory.

*A process is an instance of a program that is currently running.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

85

Interacting with the Shell

• The shell prints a prompt and waits for you to type in a command.

• The shell can deal with a couple of types of commands:– shell internals - commands that the shell

handles directly.– External programs - the shell runs a

program for you.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

86

Files and File Names

• A file is a basic unit of storage (usually storage on a disk).

• Every file has a name.• Unix file names can contain any

characters (although some make it difficult to access the file).

• Unix file names can be long!– how long depends on your specific flavor

of Unix

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

87

File Contents

• Each file can hold some raw data.• Unix does not impose any structure

on files– files can hold any sequence of bytes.

• Many programs interpret the contents of a file as having some special structure– text file, sequence of integers, database

records, etc.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

88

Directories• A directory is a special kind of file -

Unix uses a directory to hold information about other files.

• We often think of a directory as a container that holds other files (or directories).

• Mac and Windows users: A directory is the same idea as a folder.

• Folders are used as a GUI interface to directories and not unique to Unix/Linux/FreeBSD

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

89

More about File Names

• Review: every file has a name.

• Each file in the same directory must have a unique name.

• Files that are in different directories can have the same name.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

90

The Filesystem

/

bin etc home tmp usr

chrisc scully bin etc

comporg pads X ls who

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

91

Unix Filesystem

• The filesystem is a hierarchical system of organizing files and directories.

• The top level in the hierarchy is called the "root" and holds all files and directories.

• The name of the root directory is /

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

92

Pathnames

• The pathname of a file includes the file name and the name of the directory that holds the file, and the name of the directory that holds the directory that holds the file, and the name of the … up to the root

• The pathname of every file in a Unix filesystem is unique.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

93

Pathnames (cont.)

• To create a pathname you start at the root (so you start with "/"), then follow the path down the hierarchy (including each directory name) and you end with the filename.

• In between every directory name you put a "/".

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

94

Pathname Examples/

bin etc users tmp usr

chrisc scully bin etc

pads comporg X ls who

/usr/bin/lssyllabus

/users/chrisc/comporg/syllabus

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

95

Absolute Pathnames

• The pathnames described in the previous slides start at the root.

• These pathnames are called "absolute pathnames".

• We can also talk about the pathname of a file relative to a directory.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

96

Relative Pathnames

• If we are in the directory /home/chrisc, the relative pathname of the file syllabus in the directory /home/chrisc/comporg/ is:

comporg/syllabus

• Most Unix commands deal with pathnames!

• We will usually use relative pathnames when specifying files.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

97

Example: The ls command

• Exercise: login to a unix account and type the command "ls".

• The names of the files are shown (displayed) as relative pathnames.

• Try this:ls /usr

• ls should display the name of each file in the directory /usr.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

98

Disk vs. Filesystem• The entire hierarchy can actually include

many disk drives.– some directories can be on other computers

/

bin etc users tmp usr

chrisc scully

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

99

The current directory and parent directory

• There is a special relative pathname for the current directory:

.• There is a special relative pathname

for the parent directory:..

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

100

Some Simple Commands

• Here are some simple commands to get you started:– ls lists file names (like DOS dir

command).– who lists users currently logged in.– date shows the current time and date.– pwd print working directory

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

101

The ls command

• The ls command displays the names of some files.

• If you give it the name of a directory as a command line parameter it will list all the files in the named directory.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

102

ls Command Line Options• We can modify the output format of the ls program with a command line option.

• The ls command support a bunch of options:–l long format (include file times, owner

and permissions)–a all (shows hidden* files as well as

regular files)–F include special char to indicate file types.

*hidden files have names that start with "."

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

103

Moving Around in the Filesystem

• The cd command can change the current working directory:

cd change directory

• The general form is:cd [directoryname]

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

104

cd

• With no parameter, the cd command changes the current directory to your home directory.

• You can also give cd a relative or absolute pathname:

cd /usr

cd ..

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

105

Some more commands and command line options

• ls -R will list everything in a directory and in all the subdirectories recursively (the entire hierarchy).– you might want to know that Ctrl-C will

cancel a command (stop the command)!

• pwd: print working directory• df: shows what disk holds a

directory.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

106

Copying Files

• The cp command copies files:cp [options] source dest

• The source is the name of the file you want to copy.

• dest is the name of the new file.• source and dest can be relative or

absolute.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

107

Another form of cp

• If you specify a dest that is a directory, cp will put a copy of the source in the directory.

• The filename will be the same as the filename of the source file. cp [options] source destdir

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

108

Deleting (removing) Files

• The rm command deletes files:rm [options] names...

• rm stands for "remove".• You can remove many files at once:

rm foo /tmp/blah /users/clinton/intern

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

109

File attributes

• Every file has some attributes:– Access Times:

• when the file was created• when the file was last changed• when the file was last read

– Size– Owners (user and group)– Permissions

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

110

File Time Attributes

• Time Attributes:– when the file was last changed: ls -l– when the file was created*: ls -lc

– when the file was last accessed: ls -ul

*actually it’s the time the file status last changed.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

111

File Owners

• Each file is owned by a user.• You can find out the username of the

file's owner with the -l option to ls,

• Each file is also owned by a Unix group.

• ls -lg also shows the group that owns the file.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

112

File Permissions• Each file has a set of permissions

that control who can mess with the file.

• There are three kinds of permissions:– read abbreviated r– write abbreviated w– execute abbreviated x

• There are separate permissions for the file owner, group owner and everyone else.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

113

ls -l

> ls -l foo-rw-rw---- 1 chrisc grads 13 Jan 10 23:05 foo

permissionsowner group

size

time

name

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

114

ls -l and permissions

-rwxrwxrwx Owner Group Others

Type of file:- means plain filed means directory

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

115

rwx

• Files:– r: allowed to read.– w: allowed to write.– x: allowed to execute

• Directories: – r: allowed to see the names of the

files.– w: allowed to add and remove files.– x: allowed to enter the directory

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

116

Changing Permissions

• The chmod command changes the permissions associated with a file or directory.

• There are a number of forms of chmod, this is the simplest:

chmod mode file

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

117

chmod mode file

• Mode has the following form*:[ugoa][+-=][rwx]

u=user g=group o=other a=all+ add permission - remove permission = set

permission

*The form is really more complicated, but this simple version will do enough for now.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

118

chmod examples

> ls -al foo

rwxrwx--x 1 chrisc grads …

> chmod g-x foo

> ls -al foo

-rwxrw---x 1 chrisc grads

>chmod u-r .

>ls -al foo

ls: .: Permission denied

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

119

Other filesystem and file commands

• mkdir make directory

• rmdir remove directory

• touch change file timestamp (can also create a blank file)

• cat concatenate files and print out to terminal.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

120

Shells

Also known as: Unix Command Interpreter

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

121

Shell as a user interface

• A shell is a command interpreter that turns text that you type (at the command line) in to actions:– runs a program, perhaps the ls

program.– allows you to edit a command line.– can establish alternative sources of

input and destinations for output for programs.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

122

Running a Program• You type in the name of a program

and some command line options:– The shell reads this line, finds the

program and runs it, feeding it the options you specified.

– The shell establishes 3 I/O channels:• Standard Input• Standard Output• Standard Error

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

123

Programs and Standard I/O

ProgramProgramStandard Input

(STDIN)Standard Output

(STDOUT)

Standard Error(STDERR)

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

124

Unix Commands

• Most Unix commands (programs):– read something from standard input.

– send something to standard output (typically depends on what the input is!).

– send error messages to standard error.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

125

Defaults for I/O

• When a shell runs a program for you:– standard input is your keyboard.– standard output is your screen/window.– standard error is your screen/window.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

126

Terminating Standard Input

• If standard input is your keyboard, you can type stuff in that goes to a program.

• To end the input you press Ctrl-D (^D) on a line by itself, this ends the input stream.

• The shell is a program that reads from standard input.

• What happens when you give the shell ^D?

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

127

Popular Shells

sh Bourne Shell ksh Korn Shell csh C Shellbash Bourne-Again Shell

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

128

Customization

• Each shell supports some customization.– User prompt– Where to find mail– Shortcuts

• The customization takes place in startup files – files that are read by the shell when it starts up

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

129

Startup filessh,ksh:

/etc/profile (system defaults) ~/.profile

bash:

~/.bash_profile

~/.bashrc

~/.bash_logout

csh:

~/.cshrc

~/.login

~/.logout

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

130

Wildcards (metacharacters) for filename abbreviation

• When you type in a command line the shell treats some characters as special.

• These special characters make it easy to specify filenames.

• The shell processes what you give it, using the special characters to replace your command line with one that includes a bunch of file names.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

131

The special character *

• * matches anything.• If you give the shell * by itself (as a

command line argument) the shell will remove the * and replace it with all the filenames in the current directory.

• “a*b” matches all files in the current directory that start with a and end with b.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

132

Understanding *

• The echo command prints out whatever you give it:> echo hi

hi

• Try this:> echo *

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

133

* and ls

• Things to try:ls *

ls –al *

ls a*

ls *b

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

134

Input Redirection

• The shell can attach things other than your keyboard to standard input.– A file (the contents of the file are fed to

a program as if you typed it).– A pipe (the output of another program is

fed as input as if you typed it).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

135

Output Redirection

• The shell can attach things other than your screen to standard output (or stderr).– A file (the output of a program is stored

in file).– A pipe (the output of a program is fed as

input to another program).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

136

How to tell the shell to redirect things

• To tell the shell to store the output of your program in a file, follow the command line for the program with the “> ” character followed by the filename:

ls > lsoutthe command above will create a file

named lsout and put the output of the ls command in the file.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

137

Input redirection

• To tell the shell to get standard input from a file, use the “< “ character:

sort < nums• The command above would sort the

lines in the file nums and send the result to stdout.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

138

You can do both!

sort < nums > sortednums

tr a-z A-Z < letter > rudeletter

Note: “tr” command is tranlate.

Here it replaces all letters “a-z” with “A-Z”

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

139

Pipes

• A pipe is a holder for a stream of data.• A pipe can be used to hold the output

of one program and feed it to the input of another.

prog1prog1 prog2prog2STDOUT STDIN

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

140

Asking for a pipe

• Separate 2 commands with the “|” character.

• The shell does all the work!

ls | sort

ls | sort > sortedls

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

141

Shell Variables• The shell keeps track of a set of

parameter names and values.• Some of these parameters

determine the behavior of the shell.

• We can access these variables:– set new values for some to customize

the shell.– find out the value of some to help

accomplish a task.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

142

Example Shell Variablessh / ksh / bash

PWD current working directoryPATH list of places to look for

commandsHOME home directory of userMAIL where your email is storedTERM what kind of terminal you haveHISTFILE where your command

history is saved

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

143

Displaying Shell Variables

• Prefix the name of a shell variable with "$".

• The echo command will do:echo $HOME

echo $PATH• You can use these variables on any

command line:ls -al $HOME

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

144

Setting Shell Variables

• You can change the value of a shell variable with an assignment command (this is a shell builtin command):

HOME=/etc

PATH=/usr/bin:/usr/etc:/sbin

NEWVAR="blah blah blah"

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

145

set command (shell builtin)

• The set command with no parameters will print out a list of all the shell varibles.

• You'll probably get a pretty long list…

• Depending on your shell, you might get other stuff as well...

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

146

The PATH

• Each time you give the shell a command line it does the following:– Checks to see if the command is a shell

built-in.– If not - tries to find a program whose name

(the filename) is the same as the command.

• The PATH variable tells the shell where to look for programs (non built-in commands).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

147

echo $PATH======= [foo.cs.rpi.edu] - 22:43:17 =======/home/chrisc/comporg echo $PATH/home/chrisc/bin:/usr/bin:/bin:/usr/local/bin:/usr/sbin:/usr/bin/X11:/usr/games:/usr/local/packages/netscape

• The PATH is a list of ":" delimited directories.• The PATH is a list and a search order.

• You can add stuff to your PATH by changing the shell startup file (on RCS change ~/.bashrc)

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

148

Job Control

• The shell allows you to manage jobs– place jobs in the background– move a job to the foreground– suspend a job– kill a job

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

149

Background jobs• If you follow a command line with "&", the

shell will run the job in the background.– you don't need to wait for the job to complete,

you can type in a new command right away.– you can have a bunch of jobs running at once.– you can do all this with a single terminal

(window).ls -lR > saved_ls &

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

150

Listing jobs

• The command jobs will list all background jobs:

> jobs

[1] Running ls -lR > saved_ls &

>

• The shell assigns a number to each job (this one is job number 1).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

151

Suspending and Killing the Foreground Job

• You can suspend the foreground job by pressing ^Z (Ctrl-Z). – Suspend means the job is stopped, but not

dead.– The job will show up in the jobs output.

• You can kill the foreground job by pressing ^C (Ctrl-C).

• If ^C does not work, use ^Z to get back to your terminal prompt and issue:

$> kill -9 %1

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

152

Quoting - the problem

• We've already seen that some characters mean something special when typed on the command line: * (also ?, [])

• What if we don't want the shell to treat these as special - we really mean *, not all the files in the current directory:

echo here is a star *

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

153

Quoting - the solution

• To turn off special meaning - surround a string with double quotes:

echo here is a star "*”here is a star *

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

154

Quoting Exceptions• Some special characters are not

ignored even if inside double quotes:• $ (prefix for variable names)• " the quote character itself• \ slash is always something special (\n)

– you can use \$ to mean $ or \" to mean "

>echo "This is a quote \" ”

>This is a “

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

155

Single quotes

• You can use single quotes just like double quotes.– Nothing (except ') is treated special.

> echo 'This is a quote \" '> This is a quote \"

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

156

Backquotes are different!

• If you surround a string with backquotes the string is replaced with the result of running the command in backquotes:

> echo `ls`

foo fee file?

> PS1=`date`

Tue Jan 25 00:32:04 EST 2000

new prompt!

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

157

Programming tools

• Text editors– Nano– Vi (vim)– GNU emacs, Xemacs

• Compilers – gcc is probably best.• Debuggers: gdb, xgdb (old graphical),

ddd => data display debugger • Build tools: Make, autoconf, libtool

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

158

What are stdin, stdout, stderr?

• File descriptors...or more precisely a pointer to type FILE.

• These FILE descriptors are setup when your program is run.

• So, then what about regular user files...

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

159

Pipes• They to are realized as a file descriptor

which links either ouput to input or input to output.– recall doing shell commands of the form:– > ls -al | grep “Jan 1” | more– “|” is implemented as a libc call to “popen”

• Ex: let’s send e-mail from a C program...• First, how do you “sendmail”???

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

160

To send mail use “sendmail”• sendmail: is a unix command that allow the

transmission and delivery of mail.• extremely complicated program and has has been

the source of many security holes (i.e., never run sendmail on your unix machine unless you know what you’re doing).

• To use sendmail:> /usr/lib/sendmail -tTo: [email protected]: bogusSubject: testThis is a test!!.. /* NOTE: the “.\n” here is needed to terminate */

>

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

161

Putting it all together with pipes#include<stdio.h>

#include<errno.h>void main()

{FILE *mailpipe;if( NULL == (mailpipe = popen( “/usr/lib/sendmail -t”,

“w ”))){perror(“popen failed in main”);exit(-1);}

fprintf( mailpipe, “To: [email protected] \n” );fprintf( mailpipe, “From: bogus \n” );fprintf( mailpipe, “Subject: test \n” );fprintf( mailpipe, “This is a test. \n” );fprintf( mailpipe, “.\n” );pclose( mailpipe );/* could check for error here, but usually not needed */

}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

162

Operating Systems: Unix/Linux

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

163

O.S. Responsibilities

• Manages Resources:– I/O devices (disk, keyboard, mouse,

terminal)– Memory

• Manages Processes:– process creation, termination– inter-process communication– multi-tasking (scheduling processes)

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

164

Posix - Portable Operating System Interface

• Posix is a popular standard for Unix-like operating systems.

• Posix is actually a collection of standards that cover system calls, libraries, applications and more…

• Posix 1003.1 defines the C language interface to a Unix-like kernel.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

165

Posix and Unix

• Most current Unix-like operating systems are Posix compliant (or nearly so).

Linux, BSD, Solaris, IRIX

• We won’t do anything fancy enough that we need to worry about specific versions/flavors of Unix (any Unix will do).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

166

Posix 1003.1

• process primitives– creating and managing processes

• managing process environment– user ids, groups, process ids, etc.

• file and directory I/O• terminal I/O• system databases (passwords, etc)

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

167

System Calls

• A system call is an interface to the kernel that makes some request for a service.

• The actual implementation (how a program actually contacts the operating system) depends on the specific version of Unix and the processor.

• The C interface to system calls is standard (so we can write an program and it will work anywhere).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

168

Unix Processes• Every process has the following

attributes:– a process id (a small integer)– a user id (a small integer)– a group id (a small integer)– a current working directory.– a chunk of memory that hold

name/value pairs as text strings (the environment variables).

– a bunch of other things…

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

169

Creating a Process

• The only way to create a new process is to issue the fork() system call.

• fork() splits the current process in to 2 processes, one is called the parent and the other is called Regis.

• Actually it’s called the child.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

170

Parent and Child Processes

• The child process is a copy of the parent process.

• Same program.• Same place in the program (almost –

we’ll see in a second).• The child process gets a new process

ID.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

171

Process Inheritence

• The child process inherits many attributes from the parent, including:– current working directory– user id– group id

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

172

The fork() system call

#include <unistd.h>

pid_t fork(void);

fork() returns a process id (a small integer).

fork() returns twice!In the parent – fork returns the id of

the child process.In the child – fork returns a 0.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

173

Example#include <unistd.h>#include <stdio.h>

void main(void) {if (fork())

printf(“I am the parent\n”);else

printf(“I am the child\n”);printf(“I am the walrus\n”);

}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

174

Bad Example (don’t try this!)

#include <unistd.h>#include <stdio.h>

void main(void) { while (fork()) { printf("I am the parent %d\n“

,getpid()); } printf("I am the child %d\n“

,getpid());}

fork bomb!

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

175

I told you so…• Try pressing Ctrl-C to stop the program.• It might be too late.• If this is your own machine – try

rebooting.• If this is a campus machine – run for your

life. If they catch you – deny everything.

Try listening next time…

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

176

Switching Programs

• fork() is the only way to create a new process.

• This would be almost useless if there was not a way to switch what program is associated with a process.

• The exec() system call is used to start a new program.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

177

exec

• There are actually a number of exec functions:execlp execl execle execvp execv execve

• The difference between functions is the parameters… (how the new program is identified and some attributes that should be set).

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

178

The exec family

• When you call a member of the exec family you give it the pathname of the executable file that you want to run.

• If all goes well, exec will never return!

• The process becomes the new program.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

179

execl()

int execl(char *path, char *arg0, char *arg1, …,

char *argn, (char *) 0);

execl(“/home/chrisc/reverse”,“reverse”,

“HidrC”,NULL);

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

180

A complete execl example

#include <unistd.h> /* exec, getcwd */#include <stdio.h> /* printf */

/* Exec example code *//* This program simply execs "/bin/ls" */

void main(void) { char buf[1000];

printf(“Here are the files in %s:\n", getcwd(buf,1000)); execl("/bin/ls","ls","-al",NULL); printf("If exec works, this line won't be

printed\n");}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

181

fork() and exec() together

• Program does the following:– fork() - results in 2 processes– parent prints out it’s PID and waits for

child process to finish (to exit).– child prints out it’s PID and then execs

“ls” and exits.

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

182

execandfork.c part 1

#include <unistd.h> /* exec, getcwd */

#include <stdio.h> /* printf */

#include <sys/types.h> /* need for wait */

#include <sys/wait.h> /* wait() */

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

183

execandfork.c part 2

void child(void) {

int pid = getpid();

printf("Child process PID is %d\n",pid);

printf("Child now ready to exec ls\n");

execl("/bin/ls","ls",NULL);

}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

184

execandfork.c part 3

void parent(void) {

int pid = getpid();

int stat;

printf("Parent process PID is %d\n",pid);

printf("Parent waiting for child\n");

wait(&stat);

printf("Child is done. Parent now transporting to the surface\n");

}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

185

execandfork.c part 4

void main(void) {

printf("In main - starting things with a fork()\n");

if (fork()) {

parent();

} else {

child();

}

printf("Done in main()\n");

}

CSCI-2500, Fall 2012 -- C Programming and Intro to

Linux

186

execandfork.c output> ./execandforkIn main - starting things with a fork()Parent process PID is 759Parent process is waiting for childChild process PID is 760Child now ready to exec lsexec execandfork forkexec.c execandfork.c fork.cChild is done. Parent now transporting to the surface

Done in main()>