Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<sys/types.h>
- #include<unistd.h>
- #include<stdlib.h>
- // Функция за разделяне на входния буфер на съставящи го части
- int parse(char* buf, char** args)
- {
- while(*buf != '\0')
- {
- // Премахване празни позиции и табулации от
- while((*buf==' ')||(*buf=='\t'))
- *buf++ = '\0';
- // Записваме аргумента, който имаме в буфера
- *args++ = buf;
- // Търсим следващ аргумент в буфера
- while((*buf!='\0')&&(*buf!=' ')&&(*buf!='\t'))
- buf++;
- }
- *args = NULL;
- return 0;
- }
- // Изпълняване на на дъщерен процес с посочените аргументи
- void execute(char** args)
- {
- int pid, status; // pid = process identification number
- if((pid = fork()) < 0) // опит за създаване на процес
- {
- perror("Възникна грешка при опит за създаване на процес.");
- exit(1); // Край на работа на програмата и изход от нея
- }
- printf("Успешно е създаден процес с номер = %i\n", pid);
- if(pid == 0)
- {
- execvp(*args, args); // опит за изпълнение на процес
- perror("Възникна грешка при опит за изпълнение.");
- exit(1); // Край на работа на програмата и изход от нея
- }
- // Родителя изпълнява дъщерния процес и чака приключването му
- while(wait(&status)!=pid) ;;
- }
- int main() // гладна функция
- {
- char buf[1024], *args[64]; // буфер и аргументи
- while(1) // for(;;)
- {
- printf("Кажи какво да правя: ");
- if(gets(buf) == NULL)
- {
- printf("Буфера е празен.");
- exit(1); // край на работа на програмата и изходот нея
- }
- parse(buf,args); // разделя входния буфер на съставящи аргументи
- execute(args); // изпълняване на агументите
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement