Advertisement
Guest User

fork.c

a guest
Apr 23rd, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<sys/types.h>
  3. #include<unistd.h>
  4. #include<stdlib.h>
  5. // Функция за разделяне на входния буфер на съставящи го части
  6. int parse(char* buf, char** args)
  7. {
  8. while(*buf != '\0')
  9. {
  10. // Премахване празни позиции и табулации от
  11. while((*buf==' ')||(*buf=='\t'))
  12. *buf++ = '\0';
  13. // Записваме аргумента, който имаме в буфера
  14. *args++ = buf;
  15. // Търсим следващ аргумент в буфера
  16. while((*buf!='\0')&&(*buf!=' ')&&(*buf!='\t'))
  17. buf++;
  18. }
  19. *args = NULL;
  20. return 0;
  21. }
  22. // Изпълняване на на дъщерен процес с посочените аргументи
  23. void execute(char** args)
  24. {
  25. int pid, status; // pid = process identification number
  26. if((pid = fork()) < 0) // опит за създаване на процес
  27. {
  28. perror("Възникна грешка при опит за създаване на процес.");
  29. exit(1); // Край на работа на програмата и изход от нея
  30. }
  31. printf("Успешно е създаден процес с номер = %i\n", pid);
  32. if(pid == 0)
  33. {
  34. execvp(*args, args); // опит за изпълнение на процес
  35. perror("Възникна грешка при опит за изпълнение.");
  36. exit(1); // Край на работа на програмата и изход от нея
  37. }
  38. // Родителя изпълнява дъщерния процес и чака приключването му
  39. while(wait(&status)!=pid) ;;
  40. }
  41. int main() // гладна функция
  42. {
  43. char buf[1024], *args[64]; // буфер и аргументи
  44. while(1) // for(;;)
  45. {
  46. printf("Кажи какво да правя: ");
  47. if(gets(buf) == NULL)
  48. {
  49. printf("Буфера е празен.");
  50. exit(1); // край на работа на програмата и изходот нея
  51. }
  52. parse(buf,args); // разделя входния буфер на съставящи аргументи
  53. execute(args); // изпълняване на агументите
  54. }
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement