$ 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
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)
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)
$@
$<
$^
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)
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)
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)
$ 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
int creat(const char * pathname, mode_t mode)
pathname - wskaźnik do napisu zawierającego nazwę ścieżki pliku, który ma być otwarty (nazwa bezwzględna lub względna)mode - prawa dostępu (np. 0640)EEXIST - plik o podanej nazwie już istnieje, a użyto flag O_CREAT i O_EXCLEFAULT - nazwa pathname wskazuje poza dostępną przestrzeń adresowąEACCES - żądany dostęp do pliku nie jest dozwolonyENFILE - osiągnięto limit otwartych plików w systemieEMFILE - proces już otworzył dozwoloną maksymalną liczbę plikówEROFS - żądane jest otwarcia w trybie zapisu pliku będącego plikiem tylko do odczytudeskryptor pliku
int open(const char * pathname, int flags[, mode_t mode])
pathname - wskaźnik do napisu zawierającego nazwę ścieżki pliku, który ma być otwarty (nazwa bezwzględna lub względna)flags
O_RDONLY - otwarcie w trybie tylko do odczytuO_WRONLY - otwarcie w trybie tylko do zapisuO_RDWR - otwarcie w trybie do odczytu i do zapisudodatkowo:
O_CREAT - utworzenie pliku, jeśli plik jeszcze nie istniejeO_TRUNC - obcięcie pliku, jeśli plik istnieje i otwierany jest w trybie O_WRONLY lub O_RDWRO_EXCL - powoduje zgłoszenie błędu jeśli plik już istnieje i otwierany jest z flagą O_CREATO_APPEND - operacje pisania odbywają się na końcu plikumode - prawa dostępu (np. 0640)EEXIST - plik o podanej nazwie już istnieje, a użyto flag O_CREAT i O_EXCLEFAULT - nazwa pathname wskazuje poza dostępną przestrzeń adresowąEACCES - żądany dostęp do pliku nie jest dozwolonyENFILE - osiągnięto limit otwartych plików w systemieEMFILE - proces już otworzył dozwoloną maksymalną liczbę plikówEROFS - żądane jest otwarcia w trybie zapisu pliku będącego plikiem tylko do odczytudeskryptor pliku
int read(inf fd, void * buf, size_t count)
fd - deskryptor pliku z którego mają zostać odczytane danebuf - adres bufora znajdującego się w segmencie danych procesu, do którego zostaną przekazane dane odczytane z pliku w wyniku wywołania funkcji readcount - liczba bajtów do odczytaniaEINTR - wywołanie zostało przerwane sygnałem przed odczytaniem danychEAGAIN - przy użyciu O_NONBLOCK wybrano nieblokujące I/O, a nie ma akurat danych dostępnych do odczytania natychmiastEIO - błąd I/O. Zdarza się to np. jeśli proces jest w grupie procesów tła próbuje czytać z kontrolującego tty, lub ignoruje sygnał SIGTIN, lub jego grupa procesów jest osierocona.EISDIR - fd odnosi się do kataloguEBADF - fd nie jest prawidłowym deskryptorem pliku, lub nie jest otwarty dla odczytuEINVAL - fd wskazuje na obiekt nieodpowiedni do odczytuEFAULT - buf wskazuje poza dostępną przestrzeń adresowąrzeczywista liczba bajtów, jaką udało się odczytać
0 oznacza koniec pliku
int write(inf fd, void *buf, size_t count)
fd - deskryptor pliku do którego mają zostać zapisane danebuf - adres bufora znajdującego się w segmencie danych procesu, z którego zostaną pobrane dane zapisane przez funkcję writecount - liczba bajtów do zapisaniaEBADF - deskryptor fd nie jest prawidłowym deskryptorem pliku, lub nie jest otwarty dla odczytuEINVAL - deskryptor fd wskazuje na obiekt nieodpowiedni do zapisuEFAULT - deskryptor buf jest poza dostępną przestrzenią adresowąEPIPE - fd jest podłączony do potoku, lub gniazda, którego drugi koniec jest zamknięty. Gdy zdarzy się taka sytuacja, proces otrzyma sygnał SIGPIPE; jeśli jednak go przechwytuje, blokuje lub ignoruje, zwrócony zostanie błąd EPIPEEAGAIN - wybrano nieblokujący I/O (przy użyciu O_NONBLOCK) a do potoku lub gniazda o deskryptorze fd nie można natychmiast zapisać danychEINTR - wywołanie zostało przerwane sygnałem przed zapisaniem danychENOSPC - urządzenie, zawierające plik o deskryptorze fd nie ma miejsca na danerzeczywista liczba bajtów, jaką udało się zapisać
long lseek(inf fd, off_t offset, int whence)
fd - deskryptor pliku do którego mają zostać zapisane daneoffset - liczba bajtów, o jaką należy przesunąć wskaźnikwhence - parametr określający pozycję względem której jest przesuwany wskaźnik
whence = SEEK_SETwhence = SEEK_ENDwhence = SEEK_CUREBADF - deskryptor fd nie jest prawidłowym deskryptorem plikuESPIPE - fd jest związany z potokiem, gniazdem, lub FIFOEINVAL - parametr whence ma nieprawidłową wartośćnowa bieżąca pozycja wskaźnika bieżącej pozycje, liczona w bajtach względem początku pliku
int close(int fd)
fd - deskryptor zamykanego plikuEBADF - deskryptor fd nie jest prawidłowym deskryptorem otwartego pliku0
int unlink(const char *pathname)
pathname - wskaźnik do napisu zawierającego nazwę ścieżki pliku, który ma mieć usunięte dowiązanieEFAULT - nazwa pathname wskazuje poza dostępną przestrzeń adresowąEACCES - żądany dostęp do pliku nie jest dozwolony0
isascii.