Linux за българи: Форуми

Linux секция за начинаещи => Настройка на програми => Темата е започната от: petar787 в Mar 29, 2018, 19:14



Титла: Bash script
Публикувано от: petar787 в Mar 29, 2018, 19:14
Здравейте искам да попитам дали мога да създам файл без да използвам cat. Смисъл такъв да се напише скрипт и като го пусна да се създава празен файл


Титла: Re: Bash script
Публикувано от: Acho в Mar 29, 2018, 19:32
touch filename

и после отваряш filename в любимия си редактор, и си го написваш вътре. Записваш и излизаш, даваш му нужните права за изпълним файл и тестваш.


Титла: Re: Bash script
Публикувано от: petar787 в Mar 29, 2018, 19:42
Аз имам предвид няма ли как да се направи без такива опции като cat и другите. Смисъл без вградени функции, а нещо като се използват -f -a. A също не може ли пак да се създаде скрипт и като го пуснеш и напишеш името на файла той да ти го отваря


Титла: Re: Bash script
Публикувано от: 4096bits в Mar 29, 2018, 20:07
Това не са опции. Това са команди и те служат за определено нещо. Опциите към тези команди имат вида -f, -a или нещо подобно.

Можеш да създадеш файл и така:

> testo

Ето ти го и създадения току-що файл:

ls -l testo
-rw-r--r-- 1 victor victor 0 Mar 29 20:02 testo

ls тук е командата, а опцията е -l

Какво ти пречи да създадеш файл с touch?


Титла: Re: Bash script
Публикувано от: n00b в Mar 30, 2018, 02:34
echo "blah" > filename


Титла: Re: Bash script
Публикувано от: petar787 в Mar 30, 2018, 10:13
Добре направих го, обаче имам друг въпрос как да направя пак скрипт които да изпълнява друг скрипт. Примерно пускам скрипта и като напиша име на друг скрипт да ми го изпълни него.


Титла: Re: Bash script
Публикувано от: spec1a в Mar 30, 2018, 11:12
https://www.shellscript.sh

   И други подобни хелпове можеш да си намериш в интернет.


Титла: Re: Bash script
Публикувано от: 4096bits в Mar 30, 2018, 11:33
Ами човека това прави. Търси в интернет и пита тук. Тук е интернет. Що просто не му каза "Оправяй се, не си малък! Има гугъл."? Това ли е линукс обността!

И за да съм съвсем честен, питай си въпросите тук или другаде, но потърси сам в интернет наистина, просто защото може никой да не погледне темата часове, а през това време няма да имаш отговор, ако не търсиш сам.

Имаш няколко варианта.

Можеш да посочиш пълния път до скрипта. Например: /home/$USER/my_scripts/script.sh
Разбира се, скрипта трябва да е изпълним файл. Можеш да го направиш такъв с
Код:
chmod +x file_name

Ако не си ти собственика на файла, ще трябва да използваш sudo.

Друг вариант е, да пъхнеш скрипта в /usr/bin и понеже тази директория е включена в $PATH, можеш директно да го изпълниш, без да трябва да пишеш пълния път до него.

Трети вариант е да оставиш скрипта, където си е и да направиш линк към него в /usr/bin

Код:
ln -s /home/$USER/my_sripts/script.sh /usr/bin/script

Така ще имаш линк наречен script където е нужно, за да можеш да го изпълниш, само като напишеш името на линка. Може би и линка трябва да направиш изпълним, не съм сигурен.

За да изпълниш един скрипт от друг скрипт просто трябва да го извикаш. Ако скрипта не е изпълним го даваш на bash:

Код:
#!/usr/bin/bash
#

bash /home/my_scripts/script.sh

Ако скрипта е изпълним, просто го пляскаш там:

Код:
#!/usr/bin/bash
#

/home/my_scripts/script.sh

Ако си избрал варианта със създаването на линк, просто пишеш на мястото на пълния път script или каквото там смислено име си избрал и това е.

Това е, което аз зная.


Титла: Re: Bash script
Публикувано от: petar787 в Mar 30, 2018, 11:50
Търсил съм но не мога да намеря, затова пиша тука. Имам следната задача да се създаде shell скрипт предоставяща среда за създаване, редактиране, компилиране и изпълнение на файлове на базата на меню. Грешките при компилиране да се записват в отделен файл. Това с създаването и редактиране съм го направил. С компилирането също мисля че е направено, обаче това с изпълнение на файл не съм. И до колкото разбирам примерно избирам от менюто за изпълнение на файл и пиша името и той да ми стартира скрипта. Поне аз така го разбирам. И мисля че това не трябва да се прави с готови функции, а един вид аз да я напиша функцията


Титла: Re: Bash script
Публикувано от: spec1a в Mar 30, 2018, 12:12
   За да постигнеш всичко това,е необходимо много четене,моят коментар
съвсем не беше злобен,просто насочващ.
   Ако си съвсем начинаещ,наистина много трябва да се образоваш,няма
как да питаш за всяка малка стъпка (стъпките са много),просто,
сядаш,четеш и се упражняваш ...


Титла: Re: Bash script
Публикувано от: 4096bits в Mar 30, 2018, 12:14
Какви готови функции?
И така преразказано, заданието не те ограничава, как точно да изпълниш файла. Имаш да направиш менютата, компилирането, съхраняването на грешките и изпълнението на файла. Не е казано как, така ли? Е, ако е така, значи е оставено на теб, да решиш, как ще го направиш да функционира.


Титла: Re: Bash script
Публикувано от: makeme в Mar 30, 2018, 23:59
Ако не се получава всичко описано отгоре, пробвай това:

Код:
/path/to_script/./script.sh

Това ти е пътя към скрипта (който искаш да пуснеш в другия скрипт), при уговорката че преди това си го направил изпълним.(за повече яснота -  поста на @4096bits)

Цитат
chmod +x script.sh


Титла: Re: Bash script
Публикувано от: 4096bits в Mar 31, 2018, 03:00
Ако не се получава всичко описано отгоре, пробвай това:

Код:
/path/to_script/./script.sh

Това ти е пътя към скрипта (който искаш да пуснеш в другия скрипт), при уговорката че преди това си го направил изпълним.(за повече яснота -  поста на @4096bits)

Цитат
chmod +x script.sh

Имаш предвид

Код:
cd /path/to_script/
./script.sh

?


Титла: Re: Bash script
Публикувано от: Yasen6275 в Mar 31, 2018, 08:53
Ако не се получава всичко описано отгоре, пробвай това:

Код:
/path/to_script/./script.sh

Това ти е пътя към скрипта (който искаш да пуснеш в другия скрипт), при уговорката че преди това си го направил изпълним.(за повече яснота -  поста на @4096bits)

Цитат
chmod +x script.sh

Имаш предвид

Код:
cd /path/to_script/
./script.sh

?
Що трябва да влиза в директорията в която е скрипта? Спокойно си пишеш директорията"/"името на скрипта и нямаш грижи. При положение че скрипта който пишеш има права да чете и изпълнява другия, разбира се.


Титла: Re: Bash script
Публикувано от: 4096bits в Mar 31, 2018, 10:51
Каква е тази точка тогава по средата на пътя до файла?

/path/to_script/./script.sh


Титла: Re: Bash script
Публикувано от: makeme в Mar 31, 2018, 16:13
Каква е тази точка тогава по средата на пътя до файла?

/path/to_script/./script.sh
Същото, като без нея, но веднъж така поправих един скрипт и за това го предложих. Иначе би трябвало да си тръгне, както сте му написали.


Титла: Re: Bash script
Публикувано от: 4096bits в Apr 01, 2018, 10:11
Хах! Много странно. Помислих, че в бързината си забравил cd пред пътя до точката.  :D

Дали може да се създаде директория само с точка за име?
Не. Пробвах.


Титла: Re: Bash script
Публикувано от: Yasen6275 в Apr 01, 2018, 10:15
Хах! Много странно. Помислих, че в бързината си забравил cd пред пътя до точката.  :D

Дали може да се създаде директория само с точка за име?
Не. Пробвах.
Как ще създадеш директория която вече съществува?


Титла: Re: Bash script
Публикувано от: 4096bits в Apr 01, 2018, 10:48
Това ми казва и тъпата система.


Титла: Re: Bash script
Публикувано от: lunarvalley в Apr 01, 2018, 10:51
а с две точки може ли?  :D


Титла: Re: Bash script
Публикувано от: Yasen6275 в Apr 01, 2018, 10:52
Това ми казва и тъпата система.
Обикновено системата е точно толкова умна колкото ползвателя ѝ.


Титла: Re: Bash script
Публикувано от: lunarvalley в Apr 01, 2018, 10:55
е недей с рогата напред за всяко нещо де


Титла: Re: Bash script
Публикувано от: 4096bits в Apr 01, 2018, 11:37
Това ми казва и тъпата система.
Обикновено системата е точно толкова умна колкото ползвателя ѝ.
Ако с нещо съм те засегнал, извинявам се. Трябва да има причина за такова изказване и сигурно е у мен. Не обичам да премълчавам и понякога се приема не добре.  :)

А скриптове на bash пиша много рядко. Предпочитам питоня.


Титла: Re: Bash script
Публикувано от: Yasen6275 в Apr 01, 2018, 12:20
Мислех че тролиш. Предполагах че е общоизвестно какво са директориите ./ и ../
https://en.wikibooks.org/wiki/A_Quick_Introduction_to_Unix/Special_Directories.

Все пак са наследство от юникс и дори дос и бозата ги поддържат.


Титла: Re: Bash script
Публикувано от: Yasen6275 в Apr 01, 2018, 12:21
е недей с рогата напред за всяко нещо де
Нимоа. Рогато съм.  ;D


Титла: Re: Bash script
Публикувано от: stealth01 в Apr 01, 2018, 13:14
е недей с рогата напред за всяко нещо де
Нимоа. Рогато съм.  ;D
Лошо няма. Важното е, жената да е доволна...

Съжалявам, ама не се сдържах :P


Титла: Re: Bash script
Публикувано от: ddantgwyn в Apr 01, 2018, 13:21
е недей с рогата напред за всяко нещо де
Нимоа. Рогато съм.  ;D

Ъъъъ, от кога ::)


Титла: Re: Bash script
Публикувано от: spec1a в Apr 01, 2018, 13:56
е недей с рогата напред за всяко нещо де
Нимоа. Рогато съм.  ;D

   По-добре не се бъзикай със старите кучета тук.
   Съвсем приятелски съвет ...


Титла: Re: Bash script
Публикувано от: ddantgwyn в Apr 01, 2018, 20:12
е недей с рогата напред за всяко нещо де
Нимоа. Рогато съм.  ;D

По-добре не се бъзикай със старите кучета тук.

Съвсем приятелски съвет ...


Име:    spec1a
Мнения:    468 (0.300 на ден)
Позиция:    Участник
Дата на регистрация:    Дек 22, 2013, 12:11
Последно Активен:    Днес в 15:53
——
Име:    Yasen6275
Мнения:    224 (0.048 на ден)
Позиция:    Участник
Дата на регистрация:    Юли 11, 2005, 15:47
Последно Активен:    Днес в 12:21
——


::)


Титла: Re: Bash script
Публикувано от: spec1a в Apr 01, 2018, 22:16
   ЪЪЪ,аз нямах себе си предвид бе  ;D


Титла: Re: Bash script
Публикувано от: ddantgwyn в Apr 01, 2018, 22:46
   ЪЪЪ, аз нямах себе си предвид бе  ;D

Знам, ама виж и неговата регистрация ::)


Титла: Re: Bash script
Публикувано от: 4096bits в Apr 02, 2018, 12:20
Моята регистрация ли? Това не мож да е критерий за нищо. Може би, че съм малко луд, да стоя още тук  :D


Титла: Re: Bash script
Публикувано от: ddantgwyn в Apr 02, 2018, 12:49
Моята регистрация ли? Това не мож да е критерий за нищо. Може би, че съм малко луд, да стоя още тук  :D

Не, тази на Yasen6275. Вие какво? Проблем с разбирането на писан текст ли имате?

Колкото до лудостта, тези които стоим тук повече от 10 години май трябва да сме доста по-луди от теб.


Титла: Re: Bash script
Публикувано от: petar787 в Apr 02, 2018, 17:26
Не става с това изписва ми bad interpreter: No such file or directory
Ето и кода
Код:
#!/bin/bash
echo "1 - Sazdavane na fail."
echo "2- Redaktirane na fail."
echo "3 - Kompilirane na fail"
echo "4 - Izpalnenie na faila."
echo "Vavedete edin ot variantite, dadeni po gore ot menuto:"
read option
case $option in
1)
   echo -n "Vavedete imeto na faila:"
   read filename
   touch $filename   
   echo "Faila e sazdaden!";;                     
2)
   echo -n "Vavedete imeto na faila:"
   read filename2
   if [ -e $filename2 ];
   then
   nano $filename2   
   echo "Faila e redaktiran:";
   else
   echo "Faila ne sashtestvuva!";
   fi;;                                           
3)
   echo -n "Vavedete imeto na faila:"
   read filename3
   if [ -d $filename3 ];
   then
echo "Tova e direktoria!"
   else
if [[ $filename3 == *.sh ]];
then
programname="${filename3%.*}"
gcc -o $programname $filename3 &> "error.log"
else
echo "Faila ne e programa na sh."
fi
fi;;                                                                 
4)
   echo -n "Vavedete imeto na faila:"
   read filename4
   if [[ -x $filename4  &&  $filename4 == *.sh]];
   then
./$filename4
   else
   echo "Faila ne e izpalnim:"
   fi;;                                                             
*)
   echo "Opitaite otnovo!";;                                         
esac



Титла: Re: Bash script
Публикувано от: jet в Apr 02, 2018, 18:09
Смени
#!/bin/bash
с
#!/bin/sh


Титла: Re: Bash script
Публикувано от: petar787 в Apr 02, 2018, 18:20
не става обаче като махна / и остане само  . $filename стана, но искам да попитам как да го направя изпълним смисъл такъв аз първо трябва да напиша chmod u+x s.sh и след това да пусна другият скрипт за да се изпълни.


Титла: Re: Bash script
Публикувано от: makeme в Apr 02, 2018, 18:59
не става обаче като махна / и остане само  . $filename стана, но искам да попитам как да го направя изпълним смисъл такъв аз първо трябва да напиша chmod u+x s.sh и след това да пусна другият скрипт за да се изпълни.

Принципно няма логика в това "само  . $filename ", понеже .файл е съвсем друг файл за линукса (скрит). Но  понеже съм се нагледал на странности, се съгласявам :)
За изпълним файл ти трябва само "chmod +x" и си готов.

ПП: В този ред мисля, че имаш грешка:
if [[ -x $filename4  &&  $filename4 == *.sh]];
след sh трябва да има ентервал. Баша мрънка за тези неща.

ПП2: Сега го тествах това последното и при мен си работи с /:

Код
GeSHi (Bash):
  1. #!/bin/bash
  2.   echo -n "Vavedete imeto na faila:"
  3.   read filename4
  4. echo "ls" > $filename4 #Dobaven red
  5. chmod +x $filename4 #Dobaven red
  6.   if [[ -x $filename4  && $filename4 == *.sh ]] #Dobaven enterval
  7.   then
  8.        ./$filename4
  9.   else
  10.   echo "Faila ne e izpalnim:"
  11.   fi

Изход:
~# chmod +x filetest
~# ./filetest
Vavedete imeto na faila:asd.sh
asd.sh  filetest
~#


Титла: Re: Bash script
Публикувано от: makeme в Apr 02, 2018, 19:30
Съжалявам, че толкова послеписи станаха и за това пиша нов пост.

Какво прави това:

Код
GeSHi (Bash):
  1. 3)
  2.   echo -n "Vavedete imeto na faila:"
  3.   read filename3
  4.   if [ -d $filename3 ];
  5.   then
  6. echo "Tova e direktoria!"
  7.   else
  8. if [[ $filename3 == *.sh ]];
  9. then
  10. programname="${filename3%.*}"
  11. gcc -o $programname $filename3 &> "error.log"
  12. else
  13. echo "Faila ne e programa na sh."
  14. fi
  15. fi;;    
         

редове 10 и 11?             


Титла: Re: Bash script
Публикувано от: petar787 в Apr 02, 2018, 19:56
Самата 3 опция компилира програмата и ако има грешки се записва в отделен файл, а не ми ги показва в конзолата и точно тези два реда това правят прави файл в които да се запишат грешките. Поне така мисля че се прави, ако има друг вариант може да кажете и изобщо дали цялата задача е така както е условието. А колкото до това което писа с chmod +x стана прави го изпълним файл обаче с това ./ Не става да не е щото аз ползвам virtualbox с stackware 14.2.


Титла: Re: Bash script
Публикувано от: makeme в Apr 02, 2018, 20:31
Пак нещо не мога да схвана.
Проверяваш дали файла е шел скрипт и после го компилираш..?

Шел скриптовете не се компилират. Аз ли изпускам нещо?


Титла: Re: Bash script
Публикувано от: petar787 в Apr 02, 2018, 20:33
Там трябва да е *.c аз бях правил промени дали ще може с шел скрипт и съм го забравил, но иначе там трябва да е *=с


Титла: Re: Bash script
Публикувано от: makeme в Apr 02, 2018, 20:44
Аха, сега ми се поизясниха нещата.

та:
$filename3 - това е некомпилираната версия на "c" програмата
$programname - това е компилираната версия на "c" програмата

От тук отиваме на въпроса: ти на кое даваш chown +x и го стартираш? В опция 4, проверяваш дали файла е изпълним и дали е с разширение .c. Понеже не знам точния случай и ми се струва, че не компилирания файл е с име идващо от $filename3 и ти се опитваш него пак да стартираш. Ако беше случая с баш скрипт е все едно, но при твоя случай са два различни типа файла.


Титла: Re: Bash script
Публикувано от: petar787 в Apr 02, 2018, 20:56


3)
   echo -n "Vavedete imeto na faila:"
   read filename3
   if [ -d $filename3 ];
   then
   echo "Tova e direktoria!"
   else   
   if [[ $filename3 == *.с ]];
   then
      programname="${filename3%.*}"
      gcc -o $programname $filename3 &> "error.log"
   else
      echo "Faila ne e programa na С."
   fi
fi;;                                                                 
4)
   echo -n "Vavedete imeto na faila:"
   read filename4
   if [[  -x $filename4  &&  $filename4 == *.sh ]];
   then
   ./$filename4
   else
   echo "Faila ne e izpalnim:"
   fi;;                                                             
*)
   echo "Opitaite otnovo!";;                                         
esac

Аз така правя натискам 3 и компилирам някакъв .с проект и ако има грешки ги записва в error.log и после натискам 4 и избирам някакъв друг .sh файл и него пускам. Не трябва ли да е така. Защото ми каза господина, че тези опции не е задължително да е за един файл.


Титла: Re: Bash script
Публикувано от: makeme в Apr 02, 2018, 21:06
Точно така. Няма проблем едната опция да е за едно, а другата за друго.

Това...:
Код
GeSHi (Bash):
  1. 4)
  2.   echo -n "Vavedete imeto na faila:"
  3.   read filename4
  4.   if [[  -x $filename4  &&  $filename4 == *.sh ]];
  5.   then
  6.   ./$filename4
  7.   else
  8.   echo "Faila ne e izpalnim:"
  9.   fi;;  


...трябва да работи. Единственото което би го спряло е да не си в директорията, която е .sh файла или преди това да не си му дал да е изпълним (.sh файла който му пишеш името при read командата) .
 
пп: само това ли ти връща ? "bad interpreter: No such file or directory"


Титла: Re: Bash script
Публикувано от: petar787 в Apr 02, 2018, 21:13
не става утре ще го пробвам на  друг комп щото аз мисля че това е от това, че съм със stackware. Не не съм го писал писал на windows даже създавам нов скрипт с едно echo вътре и като го пусна самостоятелно работи, но като го пробвам да го пусна от скрипта ми изписва zad1.sh ./ff.sh bin/bash: bad interpreter: No such file or directory. където zad1.sh ми е скрипта с менюто, а ff.sh ми е скрипта с echo които изкам да ми изведе


Титла: Re: Bash script
Публикувано от: makeme в Apr 02, 2018, 21:14
не става утре ще го пробвам на  друг комп щото аз мисля че това е от това, че съм със stackware
Да не си го писал на някакъв уиндоус тоя скрипт и сега да имаш някакви лоши символи в него или в името на файла ?

ПП: Ако не стане и утре: Дай малко повече информация за тези скриптове. Имената на български ли са? В името има ли интервали?


Титла: Re: Bash script
Публикувано от: petar787 в Apr 02, 2018, 21:34
утре ще пробвам, но няма нищо на български


Титла: Re: Bash script
Публикувано от: makeme в Apr 02, 2018, 21:39
утре ще пробвам, но няма нищо на български

Ясно. Потвърждавам ти, че при мен целия ти скрипт работи на Ubuntu mate 16.04.

Info:
Цитат
$~# env | grep SHELL
SHELL=/bin/bash
$~# which bash
/bin/bash
$~# bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)


Титла: Re: Bash script
Публикувано от: makeme в Apr 02, 2018, 21:59
Успях да репродуцирам грешката ти :)

Във скрипта, който пуснах, махнах "/" от "#!/bin/bash"

Код
GeSHi (Bash):
  1. #!bin/bash

и получих същото:
Код
GeSHi (Bash):
  1. $~# ./filetest3: ./asd.sh: bin/bash: bad interpreter: No such file or directory

Варианта е или да имаш нещо объркано със средата, или и ти да си го изял в другия скрипт.


Титла: Re: Bash script
Публикувано от: petar787 в Apr 03, 2018, 18:07
Пробвах го и тръгна на другият комп, явно нещо от мойта среда е. Искам да попитам дали някой знае как трябва да се направи тази задача: Да се създадат три процеса, базирани на C програма комуникиращи през обща памет с размер едно цяло число. Първият процес генерира числа от 1 до 100 и ги записва в общата памет. Останалите процеси четат от общата памет като формират съответно сумите на четните и нечетните числа и ги визуализират.


Титла: Re: Bash script
Публикувано от: Ali Nebi в Apr 03, 2018, 18:57
Здравей,

Когато пишеш шел скрипт може да правиш дебъг като ползваш кода по-долу:

Код:
#!/bin/bash

# turn on debug mode
set -x

...

Другият вариянт е да стартираш скрипта така: /bin/bash -x /path/to/script/filename

Така системата ще ти дава повече информация какво точно се случва на всеки един ред от изпълнението на скрипта.

https://www.cyberciti.biz/tips/debugging-shell-script.html


Титла: Re: Bash script
Публикувано от: petar787 в Apr 03, 2018, 20:59
Аз го оправих това, но сега имам проблем с тази задача: Да се създадат три процеса, базирани на C програма комуникиращи през обща памет с размер едно цяло число. Първият процес генерира числа от 1 до 100 и ги записва в общата памет. Останалите процеси четат от общата памет като формират съответно сумите на четните и нечетните числа и ги визуализират.

Не знам как се работи с тази обща памет, изобщо тази задача ми е мъгла, ако някой може да помогне


Титла: Re: Bash script
Публикувано от: Ali Nebi в Apr 03, 2018, 21:52
Вероятно става въпрос за споделена памет: https://stackoverflow.com/questions/5656530/how-to-use-shared-memory-with-linux-in-c

Най-добре е да се поразровиш из нета. Там може да намериш информация за 99% от нещата. Опитваш се да разбереш кое какво значи, как работи и ако имаш конкретен проблем тогава питаш. Това е много по ефективен начин  наистина да научиш нещо. Ако ти казваме готови решения, то вероятно нищо няма да нучиш.



Титла: Re: Bash script
Публикувано от: remotexx в Apr 04, 2018, 01:45
Ааах, микро мениджмънт... "любимото" ми
Ама той даскала, даскала е за е... Ъъъ таковане

По начало задачата е кофти дефинирана... Би трябвало споделената памет да е за 101 цели числа, 100 които ще се обработват и 1 за флаг, че буфера е готов за обработка, като след обработката му флага се занулява. В идеалния вариант ще трябват даже 2 или N по един за всеки четец, че чукча писател да не изпраска следващия буфер преди всички читатели да са обработили предходния.
Така смотано дефинирана задачата има само едно смотано решение, чукча пише едно число и чака.. късмет че всяко едно число се обработва или само от единия или само от другия четец, и четеца който събира този вид числа го прочита и го събира и записва в същия буфер същото число но с отрицателен знак, тогава пак чукча се задейства да генерира следващото число.... Много кофти решение, но единственото работещо при така поставената задача
И теми за размисъл
Ами ако имаше числа които не се обработват от никой четец или пък и от двата напр. Първия обработва числа които се делат на 3, втория на 5 (и евентуално трети четец за числа дето се делат и на 3 и на 5) - Няма как да се мине без флаг за всеки четец, кога е приключил с обработката, че писача да запише новия буфер, и интересния вариант напр. С числото 2 никой няма да го обработи и ще почне голямото чакане, затова се работи с по големи буфери.

Обик. При подобни ситуации по по най важен е избора на протокол за комуникация а не конкретната реализация и няма значение дали ще е споделена памет или интернет връзка и т.п. и не кьоравия даскал да се прави на микро меринджей и на най великия и да казва НЕ през една клетка от паметта ще го правите само, щото обик. Микро мениджмънта води до макро осирации където накрая меринджейте се опитват да излязат сухи от водата с .... Ама аз му казах какво точно да направи ама той... Калпава реализация, като услужливо пропускат факта че при микро мениджмънт меринджея казва не само какво ами и как да се направи.


Та с две думи, само с една клетка е грешно да прехвърляш много данни, ..ама задание, какво да го правиш.
Надявам се да съм помогнал... Поне малко.

П.П. ако го видиш  :P питай го даскала как аджеба да побереш 100 цели числа в  обща памет с размер едно цяло число?


Титла: Re: Bash script
Публикувано от: 4096bits в Apr 04, 2018, 06:55
E, в условието е казано, че първия процес генерира и запсива сто числа в споделената памет. Не е казано, че трябва да запише всички сто там. Както казваш, но дори само едно число може да е.


Титла: Re: Bash script
Публикувано от: remotexx в Apr 04, 2018, 16:32
E, в условието е казано, че първия процес генерира и запсива сто числа в споделената памет. Не е казано, че трябва да запише всички сто там. Както казваш, но дори само едно число може да е.

В условието е казано числа и
през обща памет с размер едно цяло число
И нищо за протокол през който да се прехвърлят през "тясното място", споделената памет само предоставя един общ буфер, в който и двата процеса могат да четат и/ли пишат, и толкоз.

Като ще е микро мениджмънт да е докрай, като ще им задават наклона на оная работа, т.е. размера на буфера, нека им каже и к'ъв протокол да ползват, ... Или да забрави за размера и само да каже че иска да е през споделена памет, нека децата сами си решат колко да им е голям.. буфера.


Титла: Re: Bash script
Публикувано от: 4096bits в Apr 04, 2018, 20:32
Навсякъде едно и също. Тия професори са за бой.


Титла: Re: Bash script
Публикувано от: sudo в Apr 05, 2018, 11:28
Не съм съгласен че задачата за IPC е лошо дефинирана.
Напротив даже, дава се свобода за реализация (четене) от страна на студентите (или където е там).
В задачата е казано C програма комуникиращи през обща памет с размер едно цяло число
Как ще се синхронизират процесите си е избор на пишещия, ако иска през семафор, ако иска през флаг ...
Предполагам че идеята на преподавателя е Основния процес пише число, другите два четат и за който е числото той го обработва, дига флага че е готов и отново Основния процес пише ново число, дига флага, другите четат и така до 100.
Приятна задачка :)


Титла: Re: Bash script
Публикувано от: remotexx в Apr 05, 2018, 15:41
Само че синхронизацията е доста по сложна концепция от обмяната на данни и въобще не се споменава в задачата, и както казах само с един флаг не става щото има два четящи процеса, ами ако имаме и числа дето никой не ги обработва кой ще им дигне флага
Справка fizbuzz задачката

А и микро мениджъра не споменава нищо за синхронизация  :D

И най мразя такива задачи дето само присъствали на курса знаят за какво иде реч понеже 50-80%бот нещата са implied т.е. даскала е пак за и...не щото не може да си формулира задачите правилно така че и хора не присъствали на курса МУ да разберат какво е искал да каже 'автора'


Титла: Re: Bash script
Публикувано от: 4096bits в Apr 05, 2018, 16:41
Хубаво е, че все още има хора, изучаващи С.
Жабата, не зная защо, но ме дразни.


Титла: Re: Bash script
Публикувано от: petar787 в Apr 05, 2018, 17:37
Той каза че за решение на задачата се използват getmem и семафори


Титла: Re: Bash script
Публикувано от: sudo в Apr 05, 2018, 18:27
Само че синхронизацията е доста по сложна концепция от обмяната на данни и въобще не се споменава в задачата, и както казах само с един флаг не става щото има два четящи процеса, ами ако имаме и числа дето никой не ги обработва кой ще им дигне флага
В множеството на целите числа от 1 до 100, аз лично не се сещам за някое число което да е нито четно, нито нечетно.

Айде да не разпъваме локуми, а ако можем да обясним на младежа какво се иска.


Титла: Re: Bash script
Публикувано от: remotexx в Apr 05, 2018, 20:11
Той каза че за решение на задачата се използват getmem и семафори
- такааа това го нямаше в първоначалния въпрос...

Е те точно за това говорех (50+ % implied), не могат една задача да формулират като хората, е не можеа ли да го включи това условие в текста на задачата, ами човек (който ще ти пише задачата  :P) да трябва да пита какъв материал сте учили за да може да ти я напише  >:D
щото аз и със ZeroMQ ($2) мога да ти я напиша, ама ще ти пишат двойка (щото вероятно не сте го учили) ..и базирано на моя "скромен" опит - даже и да ги питаш тия дето искат някой да им реши задачата какво са учили и.. те не знаят
нищо лично, аз не хвърлям вината върхху питащите т.е. незнаещите, а върху даскалите т.е. знаещите, защото за тоя дето не знае - простено му е, ама за тоя дето знае.... (и въпреки всичко - по мързел или по некадърност - такива каквко да ги правиш, чакаш господ да слезе да си прибере вересиите)

И понеже заговорихме за синхронизация
http://blog.scottlogic.com/2015/03/20/ZeroMQ-Quick-Intro.html
https://stackoverflow.com/questions/32681838/difference-between-zeromq-and-ipc
тук давам ZeroMQ само за пример, а и защото авторите му го препоръчват дори и за локална обмяна на данни и не е по-бавно от викане на функция, но е много по скалируемо, напр. почваш от обмен м/у нишки в един и същи процес после го разделяш на два процеса на една и съща машина (IPC), после даже и на две различни (TCP/IP) и даже (ако си ползвал препоръчителните модели/patterns) скалирането идва "безплатно"- и всичко това без сериозни промени по кода (само сменяш малко настройки)

П.П. а за колегата дето излезе с частния случай че от 1..100 половината числа били четни - другата нечетни... пак твърдя че точно тази задача е много нескопосана, даже и със семафори - какво правим ако напр. суматора на нечетните числа крашне, а тоя на четните продължи да работи .. има да чааака щото пък генератора ще чака крашналия да си дигне семафора до безкрай, и всичко това като се има предвид че задачата "уж" не е за синхронизация м/у процеси а да научат как се работи със споделена памет... ама нагледал съм се на какво ли не: рекурсивни задачи да ги решават с итерация и обратно (щото такива примерни задачки е изкопирал даскала отнякъде)

П.П.П. и само за протокола, аз точно такова решение предложих (още преди да разберем, че ще трябват и други неспоменати , но надявам се учени екстри) "за решение на задачата да се използват getmem и семафори " - даже препоръчах два. Сега чакам(е) конкретни въпроси и отстраняване на проблеми с getmem и семафорите - щото па те са платформено зависими та сега ще чекаме и да ни кажат аджеба курса под Уиндоус ли е по линукс и special flavor(s)


Титла: Re: Bash script
Публикувано от: remotexx в Apr 05, 2018, 20:42
Само че синхронизацията е доста по сложна концепция от обмяната на данни и въобще не се споменава в задачата, и както казах само с един флаг не става щото има два четящи процеса, ами ако имаме и числа дето никой не ги обработва кой ще им дигне флага
В множеството на целите числа от 1 до 100, аз лично не се сещам за някое число което да е нито четно, нито нечетно.

Айде да не разпъваме локуми, а ако можем да обясним на младежа какво се иска.

Натам накъдето отиват нещата, с така поставена задача и със споделена памет и 2 семафора .. младежа нито ще научи синхронизацията, нито работата със споделена памет. Единственото което ще понаучи е, че някой неща са платформено зависими (няма как, за да ги подкара въобще)

Според мен fizzbuzz  ще е къде по добър пример от дадената задача, ще има и числа които никой не обработва и други които няколко процеса обработват.
https://en.wikipedia.org/wiki/Fizz_buzz
http://wiki.c2.com/?FizzBuzzTest



Титла: Re: Bash script
Публикувано от: 4096bits в Apr 05, 2018, 20:50
Добре!
Питоня е на друго ниво от С, но...
Зная, че Threads могат да споделят ресурс, макар, че аз не го ползвам това. Нито пиша графични приложения, нито  ми е било нужно до този момент. Менажирането обаче може да е трудничко. Сигурно за такава задачка не толкова, но...
0MQ е вариант. Ма е със сокети. Може и да не го признаят този вариант дори без библиотеката.

Named pipe?

Може ли външна променлива, подавана като параметър на процес или функция, да се смята за споделен ресурс, ако е реализирана като нещо подобно на fifo array? Можеш от единия край да си наблъскаш числата, а от другия да изтичат за обработка.

Познанията ми по програмиране не са толкова добри, та може и някоя глупост да съм изтърсил  :D


Титла: Re: Bash script
Публикувано от: remotexx в Apr 06, 2018, 01:44
Колега ако си погледнал препратките които съм дал то вероятно си се подвел понеже се говори за сокети, но това не са TCP/IP ами zmq socket като преносната среда отдолу може да е всякаква вкл. TCP,  IPC incl. shared mem, named pipes, etc.

The transport can be any of the following values:

inproc
thread to thread within a single process
ipc
inter-process communication (Linux only and not available in any of the native ports as yet)
tcp
box to box communication and inter-process when “ipc” isn’t available

Както и да е, целта на заданието явно беше да ги научи да ползват споделена памет, но не по най-добрия начин, за съжаление...


Титла: Re: Bash script
Публикувано от: petar787 в Apr 25, 2018, 21:28
Да се създадат три процеса, базирани на C програма комуникиращи през обща памет с размер едно цяло число. Първият процес генерира числа от 1 до 100 и ги записва в общата памет. Останалите процеси четат от общата памет като формират съответно сумите на четните и нечетните числа и ги визуализират.`

Почти е готова, но господина каза че трябва да използвам още един или два семафора който да използвам в PS() на процесите odd и even. Ако някой може да помогне. Аз се мъчих но не става

това е процеса Even

Код:
#include <stdio.h>
#include "shared.h"
#include <stdbool.h>
int main()
{
  int i,k,e,j;
  int *common;
  common=(int *)getmem(61560111);
  sem_t empty;
  empty = sem_init(61560111);
 
  sem_t full;
  full = sem_init(61560112);
  j=0;
  for(i=1;i<=100;i++)
  {
    *common=e;
    PS(full);
  if(e%2==0) {
   
 
 j+=e;

 VS(empty);
  }
  for(k=0;k<1000;k++);   
  }
  printf("\n");
  printf("The sum of even numbers is: %d \n",j);
  printf("Even numbers process ended. \n");
}

Процес odd
Код:
#include <stdio.h>
#include "shared.h"
#include <stdbool.h>
int main()
{
  int i,f,s,k,a;
  int sum;
  int *common;
  common=(int *)getmem(61560111);
  sem_t empty;
  empty = sem_init(61560111);
 
  sem_t full;
  full = sem_init(61560112);
  s=0;
  for(i=1;i<=100;i++)
  {
        a=*common;
    PS(full);
    if(a%2!=0) {

  s+=a;
   }
   //printf("decc %d \n", a);
   VS(empty);
   
   for(k=0;k<1000;k++);
    }
    printf("The sum of odd numbers is: %d \n",s);
    printf("Odd numbers process end. \n");
   

}
А това е процеса init където се инициализира семафорите.
Код:
#include <stdio.h>
#include "shared.h"
int main()
{
  int *common;
  common  = (int *)getmem(61560111);
  *common = 0;
 
  sem_t empty;
  empty = sem_init(61560111);
    sem_set(empty,1);
 
    sem_t full;
  full = sem_init(61560112);
    sem_set(full,0);
   
    printf("The initial %d \n", *common);
   
 
 
}