1. Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.
    Сокриј

Контролер во C (Linux)

Дискусија во форумот 'C // C++' започната од JackDaniels, 7 Декември 2010.

  1. JackDaniels

    JackDaniels
    Intern

    40
    0
    30 Мај 2009
    Здраво на сите!
    Значи задачата е следната:
    Процес (координатор) создава 5 работни процеси (пул од процеси). Работните процеси чекаат да бидат разбудени од страна на координаторот, извршуваат една работа и повторно чекаат. Координаторот пренесува ознака (маркер) (integer) на првиот процес и го буди. Процесот додава 1 на маркерот и го предава на следниот процес, и го сигнализира за тоа координаторот. Координаторот го буди следниот процес, кој ги врши истите активности итн. Маркерот треба да помине низ секој процес 10 пати и потоа координаторот да ја визуализира неговата содржина. За сигнализирање на процесите да се користат сигнали, а за пренос на маркерот да се користат канали.

    Направи ја задачата и со нишки со избирање на вистинскиот начин за комуникација.

    Некој има ли идеја како може да се направи ова чудо?
    Благодарам однапред!
     
  2. Real

    Real
    Баниран/a

    127
    12
    18 Септември 2010
    Ееееееееее текстов на македонски свучи како............ да програмираш нуклеарка.

    Со еден збор тоа се "threads"

    Конкретно да ти помогнам неможам зошто од дамна сум скаран со Ц
     
  3. Aleks

    Aleks
    Gaining Experience

    5,748
    286
    18 Мај 2007
    Да... јас имам идеја, вака... Прво што ќе треба да направиш е да научиш C. Потоа ќе треба да седнеш и да земеш да ја прочиташ убаво задачата неколку пати се додека не ти влезе во глава.

    Потоа треба да го отвориш твојот најомилен текстуален едитор и да земеш да напишеш некој код. Доколку некаде заглавиш во некое делче од кодот, пиши ни тука па тогаш конкретно ќе ти помогниме.

    :spienje:
     
  4. Petkovsky

    Petkovsky
    Intern

    323
    31
    7 Декември 2009
    Со 4 збора, тоа не се threads.

    Почни, па кога ке заглавиш пиши овде. Нема да ти ја решам задачата, ама доколку не знаеш како да почнеш може да ти објаснам сигнали, условни варијабли (променливи), семафори и други синхронизациски механизми кои ке ти требаат.

    Да, може ке ти треба и заеднички мемориски простор за процесите.
     
  5. gdamjan

    gdamjan
    On your way to fame

    2,248
    517
    3 Април 2008
    fork() ти креира нови процеси
    за синхронизација (делот „го буди“) можеш да искористиш и pipe што е најпросто ко за домашно
     
  6. JackDaniels

    JackDaniels
    Intern

    40
    0
    30 Мај 2009
    Да веќе оддамна знам за fork().
    Не треба да се користат pipes туку shared memory.
    Затоа што најпрво, pipes не се потребни за надворешна синхронизација, бидејќи процесот ќе се разбуди од страна на контролерот кога има податоци во pipe. Исто така, pipe е корисно во 1-1 а не во 1-n шеми. Второ, во 1-n шема како оваа, еден процес не подава податоци на следниот процес поради тоа што не е (не треба да биде) свесен за другите процеси, па оттука тоа е зошто треба да има еден главен (координатор) процес.
    Ќе почнам да го пишувам кодот ако заглавам ќе ве прашам пак, ако не ќе го постирам кодот во случај некој да заглави со ваква "нуклеарка" задача.
     
  7. gdamjan

    gdamjan
    On your way to fame

    2,248
    517
    3 Април 2008
    можеш да имаш еден pipe за секое дете, од контролерот до детето, не и помеѓу децата.
    А не мислев да користиш pipe за пренос на податоците (ете можеш да користиш shared memory) туку само за сигнализацијата.

    Секако има и други решенија ymmv .. Како планираш да ја решиш синхронизацијата?
     
  8. JackDaniels

    JackDaniels
    Intern

    40
    0
    30 Мај 2009
    Да, јасно. Но ќе ни требаат по 2 pipes, зошто на Linux тие не се duplex.
    Добра идеја.
    За синхронизацијата... ќе видам. Планирам да ја почнам задачава викендов, зошто работам на уште три проекти паралелно со ова и тие се приоритетни.
    Ќе видиме што ќе излезе од ова...
     
  9. gdamjan

    gdamjan
    On your way to fame

    2,248
    517
    3 Април 2008
    а да, заборавив на тоа.

    socketpair уствари е боља алтернатива на pipe:
    http://linux.die.net/man/2/socketpair
     
  10. JackDaniels

    JackDaniels
    Intern

    40
    0
    30 Мај 2009
    Еве го кодот, па ако некој друг има работа со овие глупости нека е со среќа и да се надевам дека кодов ќе послужи за нешто :bravo:
    Код:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <signal.h>
     
    #define nWORKERS 5
    #define nTOURS	10
    #define FIRST_TAG 60
     
     
    void sig_handle(int signum) { return; }
     
    int main(int argc, char *argv[])
    {
    	int i, j, tag, pipefd[2], end_trigger=-1;
    	pid_t worker[nWORKERS], co_pid;
    	const struct sigaction siga = { sig_handle, 0, 0, 0, 0 };
    	sigset_t sset, prev_sset;
     
    	sigemptyset(&sset);
    	sigaddset(&sset, SIGUSR1);
    	sigprocmask(SIG_BLOCK, &sset, &prev_sset);
     
    	if (sigaction(SIGUSR1, &siga, NULL) == -1) {
    		perror("sigaction()");
    		exit(EXIT_FAILURE);
    	}
    	if (pipe(pipefd) == -1) {
    		perror("pipe()");
    		exit(EXIT_FAILURE);
    	}
     
    	for (i=0; i < nWORKERS; i++)
     
    		if ((worker[i] = fork()) == -1) {
    			perror("fork()");
    			exit(EXIT_FAILURE);
    		}
     
    		else if (worker[i] == 0)  { /* child worker */
     
    			co_pid = getppid();
     
    			while (1) {	
    				kill(co_pid, SIGUSR1);
    				sigsuspend(&prev_sset);
    				if (read(pipefd[0], &tag, sizeof(int)) == -1) {
    					perror("read() in worker");
    					exit(EXIT_FAILURE);
    				}
    				if (tag == end_trigger) {
    					printf("---worker received end trigger\n");
    					close(pipefd[0]);
    					close(pipefd[1]);
    					exit(EXIT_SUCCESS);
    				}
     
    				tag++;
    				printf("---worker producing tag:%d\n", tag);
    				if (write(pipefd[1], &tag, sizeof(int)) == -1) {
    					perror("write() in worker");
    					exit(EXIT_FAILURE);
    				}
    			}			
    		}		
    		else   /* parent coord. */
    			sigsuspend(&prev_sset);			
     
     
    	for (tag=FIRST_TAG, i=0; i < nTOURS; i++) {
     
    		printf("Tour: %d\n", i);
     
    		for (j=0; j < nWORKERS; j++) {
     
    			printf("Sending tag:%d to worker %d\n", tag, j);
     
    			if (write(pipefd[1], &tag, sizeof(int)) == -1) {
    				perror("write in coord.");
    				exit(EXIT_FAILURE);
    			}
    			kill(worker[j], SIGUSR1);
     
    			sigsuspend(&prev_sset);
    			if (read(pipefd[0], &tag, sizeof(int)) == -1) {
    				perror("read in coord.");
    				exit(EXIT_FAILURE);
    			}
     
    			printf("Received tag:%d from worker %d\n", tag, j);			
    		}
    	}
     
    	for (i=0; i < nWORKERS; i++) {
    		if (write(pipefd[1], &end_trigger, sizeof(int)) == -1) {
    			perror("write() end trigger");
    			exit(EXIT_FAILURE);
    		}
    		kill(worker[i], SIGUSR1);
    		waitpid(worker[i], NULL, 0);
    	}
     
    	close(pipefd[0]);
    	close(pipefd[1]);
    	return(EXIT_SUCCESS);
    }
    
     
  11. Real

    Real
    Баниран/a

    127
    12
    18 Септември 2010
    А што се тогаш професоре?
     
  12. JackDaniels

    JackDaniels
    Intern

    40
    0
    30 Мај 2009
    Значи може ли малку асистенција. Прашував по англиски форуми и немаат појма.
    Значи задачата беше ок се додека не заглави virtual box. По повторно реинсталирање, задачата се компилира без грешки и се стартува без грешки, но на крајот не прави ништо. Под ништо мислам апсолутно ништо просто замислете некаков текст едитор, истата работа (може да пишуваш букви и никако не сопира програмата).
    Може ли некој да ми помогне до што е проблемот?
    Да не е до кодот? Може ли некој да погледне дали е ок?
     
  13. Petkovsky

    Petkovsky
    Intern

    323
    31
    7 Декември 2009
    Што не е јасно?

    Ајде наместо на стандарден излез, прави испис на stderr.

    Значи пример наместо printf("%d", 4)
    користи fprintf(stderr, "%d", 4);

    Можеби не гледаш ништо затоа што stdout не е синхронизиран, за разлика од stderr.

    За да не мењаш во кодот одма, најпрво пробај да го преусмериш исписот од стандарден излез на излезот за грешки (значи од stdout на stderr), пример ./program.out 1>&2

    Ако не, ке го пробам кодот кај мене па ке видиме што не чини.
     
  14. JackDaniels

    JackDaniels
    Intern

    40
    0
    30 Мај 2009
    Не, не можам никако да ја оправам. Ајде ти се молам види ја што не и е ок, зошто јас не знам што повеќе да и правам, а времето ми истекува треба до четврток да ја предадам за да можам на раат да си одам дома.
    Благодарам за помошта!
     
  15. Petkovsky

    Petkovsky
    Intern

    323
    31
    7 Декември 2009
    Код:
    ---worker producing tag:61
    ---worker producing tag:66
    ---worker producing tag:71
    ---worker producing tag:76
    ---worker producing tag:81
    ---worker producing tag:86
    ---worker producing tag:91
    ---worker producing tag:96
    ---worker producing tag:101
    ---worker producing tag:106
    ---worker received end trigger
    ---worker producing tag:62
    ---worker producing tag:67
    ---worker producing tag:72
    ---worker producing tag:77
    ---worker producing tag:82
    ---worker producing tag:87
    ---worker producing tag:92
    ---worker producing tag:97
    ---worker producing tag:102
    ---worker producing tag:107
    ---worker received end trigger
    ---worker producing tag:63
    ---worker producing tag:68
    ---worker producing tag:73
    ---worker producing tag:78
    ---worker producing tag:83
    ---worker producing tag:88
    ---worker producing tag:93
    ---worker producing tag:98
    ---worker producing tag:103
    ---worker producing tag:108
    ---worker received end trigger
    ---worker producing tag:64
    ---worker producing tag:69
    ---worker producing tag:74
    ---worker producing tag:79
    ---worker producing tag:84
    ---worker producing tag:89
    ---worker producing tag:94
    ---worker producing tag:99
    ---worker producing tag:104
    ---worker producing tag:109
    ---worker received end trigger
    ---worker producing tag:65
    ---worker producing tag:70
    ---worker producing tag:75
    ---worker producing tag:80
    ---worker producing tag:85
    ---worker producing tag:90
    ---worker producing tag:95
    ---worker producing tag:100
    ---worker producing tag:105
    ---worker producing tag:110
    ---worker received end trigger
    Tour: 0
    Sending tag:60 to worker 0
    Received tag:61 from worker 0
    Sending tag:61 to worker 1
    Received tag:62 from worker 1
    Sending tag:62 to worker 2
    Received tag:63 from worker 2
    Sending tag:63 to worker 3
    Received tag:64 from worker 3
    Sending tag:64 to worker 4
    Received tag:65 from worker 4
    Tour: 1
    Sending tag:65 to worker 0
    Received tag:66 from worker 0
    Sending tag:66 to worker 1
    Received tag:67 from worker 1
    Sending tag:67 to worker 2
    Received tag:68 from worker 2
    Sending tag:68 to worker 3
    Received tag:69 from worker 3
    Sending tag:69 to worker 4
    Received tag:70 from worker 4
    Tour: 2
    Sending tag:70 to worker 0
    Received tag:71 from worker 0
    Sending tag:71 to worker 1
    Received tag:72 from worker 1
    Sending tag:72 to worker 2
    Received tag:73 from worker 2
    Sending tag:73 to worker 3
    Received tag:74 from worker 3
    Sending tag:74 to worker 4
    Received tag:75 from worker 4
    Tour: 3
    Sending tag:75 to worker 0
    Received tag:76 from worker 0
    Sending tag:76 to worker 1
    Received tag:77 from worker 1
    Sending tag:77 to worker 2
    Received tag:78 from worker 2
    Sending tag:78 to worker 3
    Received tag:79 from worker 3
    Sending tag:79 to worker 4
    Received tag:80 from worker 4
    Tour: 4
    Sending tag:80 to worker 0
    Received tag:81 from worker 0
    Sending tag:81 to worker 1
    Received tag:82 from worker 1
    Sending tag:82 to worker 2
    Received tag:83 from worker 2
    Sending tag:83 to worker 3
    Received tag:84 from worker 3
    Sending tag:84 to worker 4
    Received tag:85 from worker 4
    Tour: 5
    Sending tag:85 to worker 0
    Received tag:86 from worker 0
    Sending tag:86 to worker 1
    Received tag:87 from worker 1
    Sending tag:87 to worker 2
    Received tag:88 from worker 2
    Sending tag:88 to worker 3
    Received tag:89 from worker 3
    Sending tag:89 to worker 4
    Received tag:90 from worker 4
    Tour: 6
    Sending tag:90 to worker 0
    Received tag:91 from worker 0
    Sending tag:91 to worker 1
    Received tag:92 from worker 1
    Sending tag:92 to worker 2
    Received tag:93 from worker 2
    Sending tag:93 to worker 3
    Received tag:94 from worker 3
    Sending tag:94 to worker 4
    Received tag:95 from worker 4
    Tour: 7
    Sending tag:95 to worker 0
    Received tag:96 from worker 0
    Sending tag:96 to worker 1
    Received tag:97 from worker 1
    Sending tag:97 to worker 2
    Received tag:98 from worker 2
    Sending tag:98 to worker 3
    Received tag:99 from worker 3
    Sending tag:99 to worker 4
    Received tag:100 from worker 4
    Tour: 8
    Sending tag:100 to worker 0
    Received tag:101 from worker 0
    Sending tag:101 to worker 1
    Received tag:102 from worker 1
    Sending tag:102 to worker 2
    Received tag:103 from worker 2
    Sending tag:103 to worker 3
    Received tag:104 from worker 3
    Sending tag:104 to worker 4
    Received tag:105 from worker 4
    Tour: 9
    Sending tag:105 to worker 0
    Received tag:106 from worker 0
    Sending tag:106 to worker 1
    Received tag:107 from worker 1
    Sending tag:107 to worker 2
    Received tag:108 from worker 2
    Sending tag:108 to worker 3
    Received tag:109 from worker 3
    Sending tag:109 to worker 4
    Received tag:110 from worker 4
    
    Ова се добива како излез. Очигледно Virtual Box-от не ти чини. Доколку е исписот точен, тогаш слободно прати ја, си работи без проблем на linux.
     
  16. JackDaniels

    JackDaniels
    Intern

    40
    0
    30 Мај 2009
    Значи работи така? Уф, да добро е тогаш. Веројатно е до Virtual Box-от. Не знам што да правам со него, можеби ќе пробам друга операциона система. Ама мислам дека и со друга операциона система ќе ја прави истата работа. Во моментов користам Kubuntu, не знам дали да пробам со Ubuntu...
    Во секој случај, благодарам што ја проба задачава, важно е да работи. :bravo:
     
Слични теми
  1. NERD.
    Одговори:
    0
    Прегледи:
    693
  2. Steff_Maja
    Одговори:
    6
    Прегледи:
    1,590
  3. Fmfob
    Одговори:
    5
    Прегледи:
    1,334
  4. VirusZ
    Одговори:
    0
    Прегледи:
    836
  5. Кристијан
    Одговори:
    13
    Прегледи:
    743
Вчитување...

Сподели

Вчитување...