powrót

Ćwiczenia 6

make

$ gcc -c -Wall -o hello.o hello.c
$ gcc -c -Wall -o bye.o bye.c
$ gcc -c -Wall -o test.o test.c
$ gcc -o program hello.o bye.o test.o

makefile

cel: zależności
	polecenie

makefile

program: hello.o bye.o test.o
	gcc  -o program hello.o bye.o test.o
hello.o: hello.c
	gcc -c -Wall -o hello.o hello.c
bye.o: bye.c bye.h
	gcc -c -Wall -o bye.o bye.c
test.o: test.c hello.h bye.h
	gcc -c -Wall -o test.o test.c

$ make
$ touch bye.c
$ make
makefile

program: hello.o bye.o test.o
	gcc  -o program hello.o bye.o test.o
hello.o: hello.c
	gcc -c -Wall -o hello.o hello.c
bye.o: bye.c bye.h
	gcc -c -Wall -o bye.o bye.c
test.o: test.c hello.h bye.h
	gcc -c -Wall -o test.o test.c
clear:
	rm -f program hello.o bye.o test.o

$ make clean
makefile

program: hello.o bye.o test.o
	gcc  -o program hello.o bye.o test.o
hello.o: hello.c
	gcc -c -Wall -o hello.o hello.c
bye.o: bye.c bye.h
	gcc -c -Wall -o bye.o bye.c
test.o: test.c hello.h bye.h
	gcc -c -Wall -o test.o test.c
.PHONY: clear
clear:
	rm -f program hello.o bye.o test.o

$ make clean

Zmienne

makefile

objects=hello.o bye.o test.o

program: $(objects)
	gcc -o program $(objects)
hello.o: hello.c
	gcc -c -Wall -o hello.o hello.c
bye.o: bye.c bye.h
	gcc -c -Wall -o bye.o bye.c
test.o: test.c hello.h bye.h
	gcc -c -Wall -o test.o test.c
.PHONY: clear
clear:
	rm -f program $(objects)

Funkcje

makefile

sources=hello.c bye.c test.c
objects=$(patsubst %.c,%.o,$(sources))

program: $(objects)
	gcc -o program $(objects)
hello.o: hello.c
	gcc -c -Wall -o hello.o hello.c
bye.o: bye.c bye.h
	gcc -c -Wall -o bye.o bye.c
test.o: test.c hello.h bye.h
	gcc -c -Wall -o test.o test.c
.PHONY: clear
clear:
	rm -f program $(objects)

$(patsubst %.c,%.o,$(sources))
$(wildcard *.c)

Zmienne automatyczne

$@
$<
$^
makefile

sources=hello.c bye.c test.c
objects=$(patsubst %.c,%.o,$(sources))

program: $(objects)
	gcc -o $@ $(objects)
hello.o: hello.c
	gcc -c -Wall -o $@ $<
bye.o: bye.c bye.h
	gcc -c -Wall -o $@ $<
test.o: test.c hello.h bye.h
	gcc -c -Wall -o $@ $<
.PHONY: clear
clear:
	rm -f program $(objects)

Reguły schematu

makefile

sources=hello.c bye.c test.c
objects=$(patsubst %.c,%.o,$(sources))

program: $(objects)
	gcc -o $@ $(objects)
hello.o: hello.c
bye.o: bye.c bye.h
test.o: test.c hello.h bye.h
%.o: %.c
	gcc -c -Wall -o $@ $<
.PHONY: clear
clear:
	rm -f program $(objects)

Reguły wbudowane

makefile

sources=hello.c bye.c test.c
objects=$(patsubst %.c,%.o,$(sources))

program: $(objects)
	gcc -o $@ $(objects)
hello.o: hello.c
bye.o: bye.c bye.h
test.o: test.c hello.h bye.h
.PHONY: clear
clear:
	rm -f program $(objects)

%.o: %.c
	$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
makefile

CC=gcc
CFLAGS=-Wall

sources=hello.c bye.c test.c
objects=$(patsubst %.c,%.o,$(sources))

program: $(objects)
	gcc -o $@ $(objects)
hello.o: hello.c
bye.o: bye.c bye.h
test.o: test.c hello.h bye.h
.PHONY: clear
clear:
	rm -f program $(objects)

Funkcje systemowe

Typy plików

Przykład:

$ cd /dev/pts
$ finger
$ chmod a+w <numer_pts>
hello.sh
#!/bin/bash
for i in `ls /dev/pts`
do
	if [ -w "/dev/pts/$i" ]
	then
		echo "Hello" > "/dev/pts/$i"
	fi
done

creat

int creat(const char * pathname, mode_t mode)

argumenty:

błędy:

zwraca:

deskryptor pliku

open

int open(const char * pathname, int flags[, mode_t mode])

argumenty:

błędy:

zwraca:

deskryptor pliku

read

int read(inf fd, void * buf, size_t count)

argumenty:

błędy:

zwraca:

rzeczywista liczba bajtów, jaką udało się odczytać
0 oznacza koniec pliku

write

int write(inf fd, void *buf, size_t count)

argumenty:

błędy:

zwraca:

rzeczywista liczba bajtów, jaką udało się zapisać

lseek

long lseek(inf fd, off_t offset, int whence)

argumenty:

błędy:

zwraca:

nowa bieżąca pozycja wskaźnika bieżącej pozycje, liczona w bajtach względem początku pliku

close

int close(int fd)

argumenty:

błędy:

zwraca:

0

ulink

int unlink(const char *pathname)

argumenty:

błędy:

zwraca:

0

Przykłady:

Zadania:

  1. Napisz program kopiujący zawartość pliku o nazwie podanej jako pierwszy parametr do pliku którego nazwa podana jest jako drugi parametr
  2. Napisz program zmieniający kolejność znaków w każdej linii pliku o nazwie podanej jako parametr.
  3. Napisz procedurę kopiowania ostatnich 10 znaków, słów i ostatnich 10 linii jednego pliku do innego.
  4. Napisz program do rozpoznawania czy plik o podanej nazwie jest plikiem tekstowym (plik tekstowy zawiera znaki o kodach 0-127 - można w tym celu użyć funkcji isascii.
  5. Napisz program, który w pliku o nazwie podanej jako ostatni argument zapisze połączoną zawartość wszystkich plików których nazwy zostały podane w linii poleceń przed ostatnim argumentem.
  6. Napisz program liczący ile jest słów w pliku (zakładamy, że słowa składają się z małych i dużych liter alfabetu oraz cyfr i znaku podkreślenia, a wszystkie pozostałe znaki są separatorami słów)