abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 03:33 | IT novinky

    Do prodeje jde tichá bezdrátová herní myš Logitech PRO X2 SUPERSTRIKE s analogovými spínači s haptickou odezvou (HITS, Haptic Inductive Trigger System). Cena je 4 459 Kč.

    Ladislav Hagara | Komentářů: 3
    včera 21:00 | Zajímavý projekt

    Microsoft na GitHubu zveřejnil zdrojový kód projektu LiteBox, jedná se o 'knihovní operační systém' (library OS) zaměřený na bezpečnost, využívající systémovou architekturu LVBS k ochraně jádra před útoky z uživatelského prostoru. LiteBox je napsán v Rustu a uvolněný pod licencí MIT. Projekt je teprve v rané fázi vývoje.

    NUKE GAZA! 🎆 | Komentářů: 1
    včera 16:11 | Zajímavý software

    BreezyBox je open-source shell a virtuální terminál pro populární jednočip ESP32. Nabízí základní unixové příkazy, sledování aktuálního pracovního adresáře (CWD), jednoduchý instalátor a spouštěč aplikací v podobě ELF binárních souborů, zabudovaný HTTP server nebo třeba ovládání WiFi - ukázka použití coby 'malého osobního počítače'. Ačkoliv je BreezyBox inspirovaný BusyBoxem, oproti němu má tento projekt několik externích závislostí, zejména na ESP-IDF SDK. BreezyBox je dostupný pod licencí MIT.

    NUKE GAZA! 🎆 | Komentářů: 0
    včera 16:00 | Humor

    Byl představen cross-assembler xa.sh, napsaný čistě v Bourne shell skriptu. Tento nástroj umožňuje zpracovávat assemblerový kód pro Intel 8080, přičemž je možné snadno přidat podporu i pro další architektury, například 6502 a 6809. Skript využívá pouze různé běžné unixové příkazy jako jsou awk, sed nebo printf. Skript si lze stáhnout z GitHubového repozitáře projektu.

    NUKE GAZA! 🎆 | Komentářů: 5
    6.2. 17:22 | IT novinky

    Byla představena nová verze modelu Claude Opus 4.6 od společnosti Anthropic. Jako demonstraci možností Anthropic využil 16 agentů Claude Opus 4.6 k vytvoření kompilátoru jazyka C, napsaného v programovacím jazyce Rust. Claude pracoval téměř autonomně, projekt trval zhruba dva týdny a náklady činily přibližně 20 000 dolarů. Výsledkem je fungující kompilátor o 100 000 řádcích kódu, jehož zdrojový kód je volně dostupný na GitHubu pod licencí Creative Commons.

    NUKE GAZA! 🎆 | Komentářů: 18
    6.2. 16:44 | Komunita

    Kultovní britský seriál The IT Crowd (Ajťáci) oslavil dvacáté výročí svého prvního vysílání. Sitcom o dvou sociálně nemotorných pracovnících a jejich nadřízené zaujal diváky svým humorem a ikonickými hláškami. Seriál, který debutoval v roce 2006, si i po dvou dekádách udržuje silnou fanouškovskou základnu a pravidelně se objevuje v seznamech nejlepších komedií své doby. Nedávné zatčení autora seriálu Grahama Linehana za hatecrime však vyvolává otázku, jestli by tento sitcom v současné Velké Británii vůbec vznikl.

    NUKE GAZA! 🎆 | Komentářů: 10
    6.2. 13:33 | IT novinky

    Společnost JetBrains oznámila, že počínaje verzí 2026.1 budou IDE založená na IntelliJ ve výchozím nastavení používat Wayland.

    Ladislav Hagara | Komentářů: 4
    6.2. 11:22 | IT novinky

    Společnost SpaceX amerického miliardáře Elona Muska podala žádost o vypuštění jednoho milionu satelitů na oběžnou dráhu kolem Země, odkud by pomohly zajistit provoz umělé inteligence (AI) a zároveň šetřily pozemské zdroje. Zatím se ale neví, kdy by se tak mělo stát. V žádosti Federální komisi pro spoje (FCC) se píše, že orbitální datová centra jsou nejúspornějším a energeticky nejúčinnějším způsobem, jak uspokojit rostoucí poptávku po

    … více »
    Ladislav Hagara | Komentářů: 27
    6.2. 11:11 | Nová verze

    Byla vydána nová verze 2.53.0 distribuovaného systému správy verzí Git. Přispělo 70 vývojářů, z toho 21 nových. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    6.2. 04:22 | Komunita

    Spolek OpenAlt zve příznivce otevřených řešení a přístupu na 216. sraz, který proběhne v pátek 20. února od 18:00 v Red Hat Labu (místnost Q304) na Fakultě informačních technologií VUT v Brně na ulici Božetěchova 1/2. Tématem srazu bude komunitní komunikační síť MeshCore. Jindřich Skácel představí, co je to MeshCore, předvede nejrůznější klientské zařízení a ukáže, jak v praxi vypadá nasazení vlastního repeateru.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (19%)
     (6%)
     (0%)
     (10%)
     (26%)
     (3%)
     (4%)
     (2%)
     (12%)
     (29%)
    Celkem 805 hlasů
     Komentářů: 25, poslední 3.2. 19:50
    Rozcestník

    Dotaz: Paralelny beh

    16.4.2010 22:25 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Paralelny beh
    Přečteno: 490×
    Skusam fork(), chcem aby mi hlavny proces sa rozdelil na n procesov a aby kazdy potomok vypisal cislo od 0 po 4. Preco to ale nebezi naraz(paralelne?)
    
    	pid_t pid[n+1];
    
    	for(p = 0; p < n; p++)
    	{
    		pid[p] = fork();
    		switch(pid[p])
    		{
    			case -1:
    				/* fork error */
    				PANIC("fork");
    				break;
    
    			case 0:
    				child = true;
    				for(int i = 0; i < 5; i++) { printf("%d\n", i); fflush(stdout); }
    				break;
    
    			default:
    				waitpid(pid[p], NULL, 0);
    				child = false;
    				break;
    		}
    		if(child) break;
    	}
    
    	printf("--- (%d) => (%d)\n", getppid(), getpid());
    
    Toto je vystup:
    
    0
    1
    2
    3
    4
    --- (12622) => (12623)
    0
    1
    2
    3
    4
    --- (12622) => (12624)
    0
    1
    2
    3
    4
    --- (12622) => (12625)
    0
    1
    2
    3
    4
    --- (12622) => (12626)
    0
    1
    2
    3
    4
    --- (12622) => (12627)
    --- (3683) => (12622)
    
    3683 je bash.

    Dakujem za radu

    Řešení dotazu:


    Odpovědi

    16.4.2010 22:38 chrono
    Rozbalit Rozbalit vše Re: Paralelny beh
    Skús tam dať nejaké čakanie (napr. 1 sekundu).
    16.4.2010 22:55 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Paralelny beh
    Myslím že vypsání těch 5 čísel je rychlejší než prodleva pro přepnutí procesu.
    In Ada the typical infinite loop would normally be terminated by detonation.
    Řešení 1× (pakanek)
    17.4.2010 00:14 FooBar
    Rozbalit Rozbalit vše Re: Paralelny beh
    Ja bych rekl, ze to nebezi paralelne proto, ze je to blbe napsany. Proces odforkuje child proces, kterej vypise naky numera, ale parent proces pak okamzite ceka na jeho dokonceni (waitpid), namisto toho, aby pokracoval forkovanim dalsich.
    Řešení 1× (pakanek)
    17.4.2010 00:27 luky
    Rozbalit Rozbalit vše Re: Paralelny beh
    V programe mas:
    default:
        waitpid(pid[p], NULL, 0);
    

    Ak tomu dobre rozumiem, tak sa hlavny proces najprv zdvoji (fork), a pocka waitpid kym synovsky proces skonci. A az potom pokracuje vo vykonavani cyklu
    17.4.2010 00:29 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: Paralelny beh
    Dakujem vsetkym za odpovede, asi FooBar a luky mate pravdu, snazim sa este to este nejako otestovat, ale v momentalnom stave mi to ide pomaly:)

    Dakujem este raz.
    17.4.2010 00:32 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: Paralelny beh
    Zabudol som ale na podstatnu vec, ja som myslel, ze IP(instruction pointer) pri forkovani sa v child-procese nastavi opat na fork, akurat navratova hodnota bude ina(teda jeho PID) a teda to rovno skoci do switchu uz v CHILD-procese a az tam vykona for cyklus. Zjavne to takto ale nefunguje, ako to teda vlastne funguje?
    17.4.2010 00:53 chrono
    Rozbalit Rozbalit vše Re: Paralelny beh
    Ano funguje to tak. Potomok začne vykonávať ten cyklus, rodič ale bude pokračovať tým volaním waitpid (takže si počká, kým sa ukončí ten potomok a až potom bude pokračovať spúšťaním ďalšieho potomka).

    Aby to fungovalo súšasne, musí sa waitpid použiť až po spustení všetkých potomkov (a teda napr. tak, že sa za ten cyklus pridá ešte jeden a v ňom bude volanie waitpid pre všetky pid; samozrejme potomok by nemal ten cyklus spúštať a aj tak tam bude potrebné sleep(1)).
    17.4.2010 10:37 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: Paralelny beh
    Dakujem za vsetky odpovede.
    17.4.2010 06:21 pakanek | skóre: 28 | Vyškov
    Rozbalit Rozbalit vše Re: Paralelny beh
    Fork afaik zkopíruje v paměti tvůj proces a v kopii nastaví návratovou hodnotu z fork na nulu. Původní proces (rodič) dostane jako návratovou hodnotu z fork PID kopie viz. man fork.
    Všechno dobré je pro něco zlé.
    17.4.2010 10:34 Zadejte vaše jméno
    Rozbalit Rozbalit vše Re: Paralelny beh
    To vypada jako uloha do IOS.
    17.4.2010 10:38 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: Paralelny beh
    Nabuduce sa aspon predstav, spoluziak ;)
    17.4.2010 10:45 moira | skóre: 30 | blog: nesmysly
    Rozbalit Rozbalit vše OT: Re: Paralelny beh
    Třeba je to učitel ;)
    Překladač ti nikdy neřekne: "budeme kamarádi"
    17.4.2010 10:48 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: OT: Re: Paralelny beh
    Tak to je snad jedno, neviem o tom, ze by som mal zakaz diskutovat o ulohach.
    mess avatar 17.4.2010 10:55 mess | skóre: 43 | blog: bordel | Háj ve Slezsku - Smolkov
    Rozbalit Rozbalit vše Re: OT: Re: Paralelny beh
    To sice ne, ale zdejší osazenstvo nemá moc rádo, když se na fóru řeší domácí úkoly, na které by si každý měl přijít sám. Pokud chceš poradit s úkolem, tak se zeptej spíš na fitušce, tam do tebe nebude nikdo rýpat, že se ptáš na domácí úkol :-)
    Cez párne mesiace zošíváš vaginy, cez neparne montuješ hajzle.
    17.4.2010 10:58 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: OT: Re: Paralelny beh
    Tak to sa ospravedlnujem, ale myslel som, ze sa to moze hodit aj inym, nie len do skoly.
    17.4.2010 11:31 Zdenek
    Rozbalit Rozbalit vše Re: OT: Re: Paralelny beh
    Takto polozeny dotaz je ale v poradku. Jde za nim videt jistou praci a snahu porozumet zadanemu ukolu. Co zdejsi osazenstvo vytaci je, tupe copy&paste otazky a ocekavani hotove prace.
    Heron avatar 17.4.2010 12:33 Heron | skóre: 53 | blog: root_at_heron | Olomouc
    Rozbalit Rozbalit vše Re: OT: Re: Paralelny beh
    Přesně to jsem chtěl napsat :-).

    Vypracovávání domácích úkolů ne, řešení chyb a rady ke zlepšení jednoznačně ano.
    17.4.2010 11:49 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: Paralelny beh
    Narazil som este na jednu vec, ktorej nie celkom rozumiem. Nasledujuci kod spusti pekne n vlakien:
    for(p = 0; p < n; p++)
    {
    	pid[p] = fork();
    	switch(pid[p])
    	{
    		case -1:
    			/* fork error */
    			PANIC("fork");
    			break;
    
    		case 0:
    			child = true;
    			break;
    
    		default:
    			child = false;
    			break;
    	}
    	if(child) break;
    }
    
    if(child)
    {
    	sleep(5);
    	//do_child_job(p);
    }
    
    if(parent)
    {
    	for(p = 0; p < n; p++)
    	{
    		printf("parent\n");
    		waitpid(pid[p], NULL, 0);
    	}
    
    Problem je vsak, ze ked napriklad 1. child proces nieco robi dlhsie, tak waitpid zablokuje hlavny proces cakanim na skoncenie a az potom sa zavola waitpid na dalsie procesy. Comu ale uz vobec nerozumiem, preco sa tento kod sprava tak, ze da takyto vystup:
    
    parent // tu caka tych 5 sekund
    parent // dalsie 4 riadky uz vypise okamzite
    parent
    parent
    parent
    
    Slo by asi pouzit WNOHANG vo waitpid namiesto 0, ale potom hlavny proces skonci a nepocka na skoncenie deti.

    Ako teda zabezpecit, ze hlavny proces nebude blokovany child procesmy, ale zaroven pocka, kym vsetky skoncia?
    mess avatar 17.4.2010 12:23 mess | skóre: 43 | blog: bordel | Háj ve Slezsku - Smolkov
    Rozbalit Rozbalit vše Re: Paralelny beh
    No, mě napadlo toto:
    1. Nejdřív uděláš 5x fork a uložíš si PID těch child procesů.
    2. Uděláš, co potřebuješ v hlavním procesu.
    3. Zavoláš waitpid na každý PID child procesu. Tím se zajistí, že hlavní proces počká, až všichni skončí.
    Pokud potřebuješ mít ten hlavní proces pořád aktivní, tak bych zkusil něco jako smyčku, která bude periodicky testovat stav childů a v případě, že běží, tak bude něco dělat (to bude asi to horší řešení). Nebo si udělej handler na SIGCHLD a než ti ten signál přijde, tak můžeš dělat něco užitečného.
    Cez párne mesiace zošíváš vaginy, cez neparne montuješ hajzle.
    17.4.2010 16:22 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: Paralelny beh
    Dakujem, skusil som to s tym signalom, aj to vacsinou funguje, niekedy vsak ten signal proste sa neemituje. Vobec nechapem od coho to zavisi, lebo child proces skonci. Skusim prilozit relevantny kod:
    
    static void sigchld_hdl(int sig)
    {
    	running_children--;
    	printf("sigchld_hdl\n"); fflush(stdout);
    	/* Wait for all dead processes.
    	* We use a non-blocking call to be sure this signal handler will not
    	* block if a child was cleaned up in another part of the program. */
    	while (waitpid(-1, NULL, WNOHANG) > 0)
    	{
    	}
    	if(running_children == 0) // toto je vlastne na upratanie po detoch, ked uz vsetky su skoncene
    	{
    		printf("--QUITING\n"); fflush(stdout);
    		
    		fclose(fp);
    
    		if (msgctl(msqid, IPC_RMID, NULL) == -1)
    			PANIC("msgctl");
    		
    		exit(EXIT_SUCCESS);
    	}
    }
    
    
    potom v main()
    	struct sigaction act;
     
    	memset (&act, 0, sizeof(act));
    	act.sa_handler = sigchld_hdl;
     
    	if (sigaction(SIGCHLD, &act, 0)) {
    		perror ("sigaction");
    		return 1;
    	}
    
    	for(p = 0; p < n; p++)
    	{
    		pid[p] = fork();
    		switch(pid[p])
    		{
    			case -1:
    				/* fork error */
    				PANIC("fork");
    				break;
    
    			case 0:
    				child = true;
    				break;
    
    			default:
    				child = false;
    				running_children++;
    				printf("adding child: %ld\n", running_children); fflush(stdout);
    				break;
    		}
    		if(child) break;
    	}
    
    	if(child)
    	{
    		printf("(%d) cakam...\n", getpid()); fflush(stdout);
    		msg_rcv(READY_TO_START);
    		printf("(%d) child\n", getpid()); fflush(stdout);
    		exit(EXIT_SUCCESS);
    // 		sleep(1);
    	}
    
    	if(parent)
    	{
    		for(p = 0; p < n; p++)
    		{
    			printf("parent\n"); fflush(stdout);
    			waitpid(pid[p], NULL, WNOHANG);//WNOHANG
    			msg_snd(READY_TO_START, READY_TO_START_TRUE);
    		}
    		
    		while (running_children>0) {
    			sleep(1);
    			printf("sleeping, running children: %ld\n", running_children); fflush(stdout);
    		}
    	}
    
    Toto teda vacsinou funguje, avsak niekedy sa to zasekne na tom poslednom while(running_children>0) a vystup je takyto:
    
    $ ./philosophers 5
    (26467) >> sending message(1): 1
    (26467) >> sending message(2): 0
    adding child: 1
    (26468) cakam...
    adding child: 2
    (26469) cakam...
    adding child: 3
    (26470) cakam...
    adding child: 4
    (26471) cakam...
    adding child: 5
    parent
    (26467) >> sending message(3): 0
    parent
    (26468) >> receiving message(3): 0
    (26468) child
    (26469) >> receiving message(3): 0
    (26469) child
    sigchld_hdl
    (26467) >> sending message(3): 0
    parent
    (26467) >> sending message(3): 0
    parent
    (26470) >> receiving message(3): 0
    (26470) child
    (26471) >> receiving message(3): 0
    (26471) child
    (26472) cakam...
    sigchld_hdl
    (26467) >> sending message(3): 0
    parent
    (26467) >> sending message(3): 0
    (26472) >> receiving message(3): 0
    (26472) child
    sigchld_hdl
    sleeping, running children: 2
    sleeping, running children: 2
    sleeping, running children: 2
    sleeping, running children: 2
    sleeping, running children: 2
    sleeping, running children: 2
    sleeping, running children: 2
    sleeping, running children: 2
    sleeping, running children: 2
    ^C
    
    Chape to niekto?

    Dakujem
    18.4.2010 10:09 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: Paralelny beh
    Ak teda konkretne nikto nevie odpovedat, tak sa aspon spytam takto: Je mozne aby SIGCHLD proste nedorazil po skonceni procesu? Ako vlastne ten mechanizmus funguje? Alebo mam hladat chybu inde?

    Dakujem
    18.4.2010 10:55 chrono
    Rozbalit Rozbalit vše Re: Paralelny beh
    Keď rodič spí a ukončí sa viac potomkov, rodič nemusí dostať viac tých signálov (takže by si tam mal upraviť ten while cyklus a počítať s tým, že sa nemusel ukončiť ani jeden potomok alebo sa ich mohlo ukončiť niekoľko naraz).
    18.4.2010 11:24 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: Paralelny beh
    Dakujem za radu, ale nerozumiem ako to myslis. Ako zistim, ze som nedostal viac signalov ako som mal alebo menej?
    18.4.2010 11:34 chrono
    Rozbalit Rozbalit vše Re: Paralelny beh
    waitpid vráti PID procesu, ktorý zmenil svoj stav (takže pre začiatok do toho while vo funkcii sigchld_hdl skús pridať vypisovanie toho PID).
    18.4.2010 11:37 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: Paralelny beh
    Dakujem, vyriesil som to trochu inak. Vo fronte mam ulozeny pocet procesov, ktory ked decko zomre, tak znizi, ked vznikne tak sa zvysi. Zda sa, ze to funguje spolahlivo.
    Bluebear avatar 18.4.2010 16:02 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
    Rozbalit Rozbalit vše Re: Paralelny beh
    Signály, jako je SIGCHLD, totiž nevytvářejí frontu. Pokud je SIGCHLD poslán procesu, který ho nemůže právě zpracovat (tzn. je ve stavu "uninterruptible wait", nebo tento signál blokuje, třeba proto, že už zpracovává ten předchozí), tak se nastaví flag, že byl poslán SIGCHLD. Pokud ale během této doby přijde signálů SIGCHLD víc, nestavějí se do fronty, ale ty další se prostě ztratí; zůstane jen ten flag.

    Jiná je situace u POSIX realtime signálů (viz "man 7 signal"), které vytvářejí opravdovou frontu a budou doručeny tolikrát, kolikrát byly přijaty, v patřičném pořadí.
    To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...
    18.4.2010 16:17 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: Paralelny beh
    Hm, to som nevedel, dakujem, musim sa na tie realtime signaly pozriet.
    18.4.2010 13:38 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Paralelny beh

    Problém už byl vyřešen, ale neodpustím si terminologickou poznámku:

    Nasledujuci kod spusti pekne n vlakien:

    Syscall fork() nevytváří vlákna ale procesy. Vlákna by se vytvářela pomocí pthread_create().

    18.4.2010 14:55 kovariadam | skóre: 12 | blog: biased | Košice/Brno
    Rozbalit Rozbalit vše Re: Paralelny beh
    Samozrejme mate pravdu. Chybicka sa vludila.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.