Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.74 KB | None | 0 0
  1. pon, 17 cze 2019, 11:34:57 CEST
  2. Grzegorz Otto nr ind. 234941
  3. PN TN 11-13
  4. Nr tematu 6
  5. Funkcje systemowe
  6.  
  7. 1. Napisz program kopiuj±cy zawarto¶ć pliku o nazwie podanej jako pierwszy parametr do pliku którego nazwa podana jest jako drugi parametr
  8.  
  9. Komenda użyta do kompilacji: gcc -o p1 p1.c
  10.  
  11. Próba skompilowania pierwszego przykładowego programu do kopiowania nie powiodła się ze względu na niedoł±czone nagłówki unistd.h i cstdlib.h
  12.  
  13. Po doł±czeniu plików nagłówkowych program się skompilował.
  14. Program uruchomiłem wprowadzaj±c do terminala komendę: ./p1 zrodlo cel
  15. Po wykonaniu programu, w pliku cel znajdowala sie zawarto¶ć pliku zrodlo
  16.  
  17. 3. Napisz program, który w pliku o nazwie podanej jako ostatni argument zapisze poł±czon±
  18. zawarto¶ć wszystkich plików których nazwy zostały podane w linii poleceń przed ostatnim
  19. argumentem.
  20.  
  21. Poniżej zamieszczam kod Ľródłowy powstały poprzez modyfikację programu 1.
  22.  
  23. #include <stdlib.h>
  24. #include <fcntl.h>
  25. #include <stdio.h>
  26. #include <unistd.h>
  27.  
  28. #define MAX 512
  29.  
  30.  
  31. int main(int argc, char* argv[])
  32. {
  33. char buf[MAX];
  34. int desc_zrod, desc_cel;
  35. int lbajt;
  36. if (argc<3) // chcemy conajmniej 2 podane pliki
  37. {
  38. fprintf(stderr, "Za malo argumentow. Uzyj:\n");
  39. fprintf(stderr, "%s <pliki zrodlowe> <plik docelowy>\n",
  40. argv[0]);
  41. exit(1);
  42. }
  43. for(unsigned i = 0; i<argc-2; ++i) // wykonaj tyle razy, ile jest plikow zrodlowych
  44. {
  45. desc_zrod = open(argv[1+i], O_RDONLY);
  46. if (desc_zrod == -1)
  47. {
  48. perror("Blad otwarcia pliku zrodlowego");
  49. exit(1);
  50. }
  51.  
  52. desc_cel = open(argv[argc-1], O_CREAT | O_RDWR | O_APPEND, 0640); // ostatni
  53. if (desc_cel == -1)
  54. {
  55. perror("Blad utworzenia pliku docelowego");
  56. exit(1);
  57. }
  58.  
  59. while((lbajt = read(desc_zrod, buf, MAX)) > 0)
  60. {
  61. if (write(desc_cel, buf, lbajt) == -1)
  62. {
  63. perror("Blad zapisu pliku docelowego");
  64. exit(1);
  65. }
  66. }
  67. if (lbajt == -1)
  68. {
  69. perror("Blad odczytu pliku zrodlowego");
  70. exit(1);
  71. }
  72. if (close(desc_zrod) == -1)
  73. {
  74. perror("Blad zamkniecia pliku");
  75. exit(1);
  76. }
  77. }
  78. close(desc_cel);
  79. exit(0);
  80. }
  81.  
  82. Komenda użyta do kompilacji: gcc -o p3 p3.c
  83. Komenda użyta do uruchomienia: ./p3 test1 test2 test3 test4
  84. Rezultat: powstanie pliku test4 zawieraj±cego zawarto¶ć plików test1 test2 test3
  85.  
  86. 4. Napisz program licz±cy ile jest słów w pliku (zakładamy, że słowa składaj± się z małych i
  87. dużych liter alfabetu oraz cyfr i znaku podkre¶lenia, a wszystkie pozostałe znaki s± separatorami słów)
  88.  
  89. #include <stdlib.h>
  90. #include <fcntl.h>
  91. #include <stdio.h>
  92. #include <unistd.h>
  93. #include <ctype.h>
  94. #include <stdbool.h>
  95.  
  96. #define MAX 512
  97.  
  98.  
  99. int main(int argc, char* argv[])
  100. {
  101. bool was_alnum = false;
  102. unsigned n_words = 0;
  103. char buf[MAX];
  104. int desc_zrod, desc_cel;
  105. int lbajt;
  106. if (argc!=2) // chcemy tylko 1 argument
  107. {
  108. fprintf(stderr, "Bledna liczka argumentow. Uzyj:\n");
  109. fprintf(stderr, "%s <plik zrodlowy>\n",
  110. argv[0]);
  111. exit(1);
  112. }
  113. desc_zrod = open(argv[1], O_RDONLY);
  114. if (desc_zrod == -1)
  115. {
  116. perror("Blad otwarcia pliku zrodlowego");
  117. exit(1);
  118. }
  119.  
  120. while((lbajt = read(desc_zrod, buf, MAX)) > 0)
  121. {
  122. for(unsigned i = 0; i<lbajt; ++i)
  123. {
  124.  
  125. if (!isalnum(buf[i]) && buf[i] != '_')
  126. {
  127. if(was_alnum)
  128. {
  129. ++n_words;
  130. }
  131. was_alnum = false;
  132. }
  133. else
  134. {
  135. was_alnum = true;
  136. }
  137. }
  138. }
  139. if (lbajt == -1)
  140. {
  141. perror("Blad odczytu pliku zrodlowego");
  142. exit(1);
  143. }
  144. if (close(desc_zrod) == -1)
  145. {
  146. perror("Blad zamkniecia pliku");
  147. exit(1);
  148. }
  149. printf("Znaleziono %d wyrazow\n", n_words);
  150. close(desc_cel);
  151. exit(0);
  152. }
  153.  
  154.  
  155.  
  156. Komenda użyta do kompilacji: gcc -o p4 p4.c
  157. Komenda użyta do uruchomienia: ./p4 test
  158. Rezultat: wypisanie na ekranie prawidłowej liczby wyrazów
  159.  
  160. 5. Napisz program tworz±cy dwa procesy. Każdy ze stworzonych procesów powinien utworzyć proces - potomka. Należy wy¶wietlać identyfikatory procesów rodziców i potomków po każdym wywołaniu funkcji fork.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement