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; }