open(2), creat(2), read(2), write(2), stat(2), close(2), getenv(3), putenv(3), setenv(3) errno(3), environ(7).int.creat(2)open(2)creat() jest szczególnym przypadkiem open() - na serwerze SPK mają dokładnie tę samą stronę w manualu.read(2)write(2)close(2)System udostępnia również kilka funkcji oferujących zaawansowane operacje na plikach:
chmod(2), chown(2),access(2), lseek(2), czy link(2) zwiększają możliwości operowania na plikach,stat(2) zwraca informacje o pliku.opendir(3), closedir(3),scandir(3).environ(7),getenv(3), putenv(3), setenv(3).execve(2)exec(3) [czym się różnią między sobą?]system(3), która uruchamia zewnętrzne polecenie w osobnym procesie (i zbiera wyjście)fork(2)#include <stdio.h> #include <fcntl.h> #include <unistd.h> #define BUFSIZE 1024 int main (int argc, char **argv) { int f1, c; char b[BUFSIZE], *n1; c = 10; n1 = argv[1]; f1 = open (n1, O_RDONLY); read (f1, b, c); printf("%s: Przeczytano %d znaków z pliku %s: \"%s\"\n", argv[0], c, n1, b); close(f1); return(0); }
gcc -Wall -ansi -pedantic f1.c -o f1
open() i read()printf() jako liczbę przeczytanych znaków?#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #define BUFSIZE 1024 int main (int argc, char **argv) { int f1, f2, c; char b[BUFSIZE], *n1, *n2; c = 10; n1 = argv[1]; n2 = argv[2]; f1 = open (n1, O_RDONLY); read (f1, b, c); printf("%s: Przeczytano %d znaków z pliku %s: \"%s\"\n", argv[0], c, n1, b); f2 = open (n2, O_WRONLY | O_CREAT | O_TRUNC, 0600); write (f2, b, c); printf("%s: Zapisano %d znaków do pliku %s: \"%s\"\n", argv[0], c, n2, b); close(f1); close(f2); return(0); }
gcc -Wall -ansi -pedantic f2.c -o f2
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/dir.h> #define MAX_CHAR 200 int main(int argc, char **argv) { int t; struct direct *e; DIR *d; struct stat s; char p[MAX_CHAR]; d = opendir(argv[1]); while ((e = readdir(d)) != 0) { printf("%d %s", (int)e->d_ino, e->d_name); if (strcmp(e->d_name, ".") != 0 && strcmp(e->d_name, "..") != 0) printf("\n"); else { p[0] = 0; strcat(p, argv[1]); strcat(p, "/"); strcat(p, e->d_name); t = stat(p, &s); if (S_ISDIR(s.st_mode)) printf("/"); printf("\n"); } } closedir(d); return 0; }
ls, czyli czytanie kolejnych danych zwracanych przez funkcję stat()#include <stdio.h> #include <unistd.h> extern char **environ; /* można skorzystać ze zmiennej environ z unistd.h ... */ int main (int argc, char **argv, char **envp) { /* ... albo z trzeciego argumentu main() */ int i; printf("Srodowisko procesu:\n"); for (i = 0; envp[i] != NULL;i++) printf("%s\n", envp[i]); return 0; }
#include <stdio.h> #include <unistd.h> #include <stdlib.h> extern char **environ; int main (int argc, char **argv, char **envp) { printf("Poczatek procesu.\n"); system("echo ala ma kota"); printf("Dalszy ciag kodu...\n"); execl("/bin/echo", "echo", "jakis napis", NULL); printf("Koniec kodu...\n"); return 0; }
system() a exec()?exec()#include <stdio.h> #include <unistd.h> #include <stdlib.h> extern char **environ; int main (int argc, char **argv, char **envp) { int p=0; printf("%s[%d]: Poczatek procesu glownego...\n", *argv, getpid()); p = fork(); if (p == -1) printf("%s[%d]: BLAD! Nie moge stworzyc procesu!\n", *argv, getpid()); else if (p > 0) { printf("%s[%d]: To dalej ja, proces glowny...\n", *argv, getpid()); sleep(5); } else if (p == 0) { printf("%s[%d]: Jestem procesem potomnym, moj rodzic to: [%d]...\n", *argv, getpid(), getppid()); exit(0); } printf("%s[%d]: Koniec procesu glownego...\n", *argv, getpid()); return 0; }
sleep(), jak to wpłynie na działanie procesów?#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> extern char **environ; int main (int argc, char **argv, char **envp) { int p=0, p1=0; printf("%s[%d]: Poczatek procesu glownego...\n", *argv, getpid()); p = fork(); if (p == -1) printf("%s[%d]: BLAD! Nie moge stworzyc procesu!\n", *argv, getpid()); else if (p > 0) { printf("%s[%d]: To dalej ja, proces glowny...\n", *argv, getpid()); } else if (p == 0) { printf("%s[%d]: Jestem procesem potomnym, moj rodzic to: [%d]...\n", *argv, getpid(), getppid()); sleep(5); printf("%s[%d]: Koncze ze soba!\n", *argv, getpid()); exit(0); } p1=wait(NULL); printf("%s[%d]: Jestem bezdzietny, nie ma juz: %d :(\n", *argv, getpid(), p1); printf("%s[%d]: Koniec procesu glownego.\n", *argv, getpid()); return 0; }
sleep() - co się zmieniło? czym różni się ten program od poprzedniego?#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> extern char **environ; int main (int argc, char **argv, char **envp) { int p=0, p1=0; printf("%s[%d]: Poczatek procesu glownego...\n", *argv, getpid()); p = fork(); if (p == -1) printf("%s[%d]: BLAD! Nie moge stworzyc procesu!\n", *argv, getpid()); else if (p > 0) { printf("%s[%d]: To dalej ja, proces glowny...\n", *argv, getpid()); } else if (p == 0) { printf("%s[%d]: Jestem procesem potomnym, moj rodzic to: [%d]...\n", *argv, getpid(), getppid()); printf("%s[%d]: Moge byc kims innym!\n", *argv, getpid()); execl("/bin/echo", "echo", "moge stac sie programem ktory cos pisze!", NULL); } p1=wait(NULL); printf("%s[%d]: Jestem bezdzietny, nie ma juz: %d :(\n", *argv, getpid(), p1); printf("%s[%d]: Koniec procesu glownego.\n", *argv, getpid()); return 0; }
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> #include <fcntl.h> #include <sys/stat.h> #define BUFSIZE 1024 #define CPC 5 #define NC 5 extern char **environ; int main (int argc, char **argv, char **envp) { int p=0, p1=0, f, n=5, c, i, j; char *b, *n1; c = NC; n1 = argv[1]; printf("%s[%d]: Poczatek procesu glownego...\n", *argv, getpid()); f = open(n1, O_RDONLY); for (i=0; i<n; i++) { p = fork(); if (p == -1) printf("%s[%d]: BLAD! Nie moge stworzyc procesu!\n", *argv, getpid()); else if (p > 0) { printf("%s[%d]: To dalej ja, proces glowny...\n", *argv, getpid()); } else if (p == 0) { printf("%s[%d]: Jestem procesem potomnym, moj rodzic to: [%d]...\n", *argv, getpid(), getppid()); sleep(1); lseek(f, i*CPC, SEEK_SET); b = malloc(sizeof(char)*c+1); j = read (f, b, c); b[c+1]='\n'; printf("%s: Przeczytano %d znaków, poczynajac od: %d, z pliku %s: \"%s\"\n", argv[0], j, i*CPC, n1, b); free(b); exit(0); } } p1=wait(NULL); printf("%s[%d]: Jestem bezdzietny, ostatnie dziecko to: %d :(\n", *argv, getpid(), p1); close(f); printf("%s[%d]: Koniec procesu glownego.\n", *argv, getpid()); return 0; }