Главная страница


ru.linux

 
 - RU.LINUX ---------------------------------------------------------------------
 From : Sergey Agafonov                      2:5022/103.46  29 May 2005  15:01:36
 To : All
 Subject : Need Help!
 -------------------------------------------------------------------------------- 
 
 
 Заранее прошу прощенья за ламерские вопросы, в программировании я совсем, совсем
 чайник.
 
 Почти доделал свой курсач (Shell). Hе могу пофиксить последний баг. Уверен
 проблема легко решаема, но со своими кривыми руками и головой я буду долго
 искать грабли (а дедлайн уже 3-го).
 
 Что делаю:
 
 1) Создаю разделяемую память Posix (shm_open) и подключаю к адресному пр-ву
 процесса (mmap).
 2) В этой памяти хранится счетчик кол-ва запущенных фоновых процессов.
 3) При завершении фоновый процесс уменьшает значение счетчика (ф-я
 zombiehunter), при запуске, соотв. увеличивает (ф-я exec_cmd).
 4) Атомарность операций обеспечена семафором System V
 5) Stdout фоновых процессов перенаправлен в FIFO, кот. соединен с сервером
 вывода.
 
 При выходе из прогаммы:
 
 if(!strcmp(Cmd.argv[0], "exit"))
     {
     shm_unlink("/tmp/fone.SHM");
     munmap(ptr,sizeof(struct shmstruct));
     exit(0);
     }
 
 До приглашения почему-то выводятся цифры, например: 12#
 Кол-во цифр каким-то образом зависит от числа запускавшихся фоновых процессов.
 Без разделяемой памяти все работает нормально.
 
 Где грабли? Кажется я что-то делаю неправильно с памятью, а что, не пойму. :(
 Вот те части кода где используется shared memory:
 
 //=============================================================================
 struct  shmstruct {int count;};
 struct  shmstruct *ptr;
 
 void zombiehunter(int sig)
 {
 char pidstr[MAXCMD];
 long pid;
 struct  sembuf opt1= {2,-1,0};
 
 while((pid=waitpid(-1,0,WNOHANG))>0)
     {
     semop(semid2,&opt1,1);
     printf("%d",ptr->count--);
     opt1.sem_op=1;
     semop(semid2,&opt1,1);
 
     bzero(pidstr,strlen(pidstr));
     snprintf(pidstr,MAXCMD,"\n[%d] ",ptr->count);
     write(1,pidstr,strlen(pidstr));
 
     bzero(pidstr,strlen(pidstr));
     snprintf(pidstr,MAXCMD,"%ld ",pid);
     strcat(pidstr,"Done!\n");
     write(1,pidstr,strlen(pidstr));
     }
 }
 
 //============================================================================= 
 int exec_cmd()
 {
 
 if(!strcmp(Cmd.argv[0], "exit"))
     {
     shm_unlink("/tmp/fone.SHM");
     munmap(ptr,sizeof(struct shmstruct));
     exit(0);
     }
 
 if(fork())return 0;
     else
     {
     char pid[MAXCMD];
     struct  sembuf opt1= {2,-1,0};
 
     semop(semid2,&opt1,1);
     printf("%d",ptr->count++);
     opt1.sem_op=1;
     semop(semid2,&opt1,1);
 
     snprintf(pid,MAXCMD,"\n[%d] ",ptr->count);
     write(1,pid,strlen(pid));
     bzero(pid,strlen(pid));
 
     snprintf(pid,MAXCMD,"%ld ",(long)getpid());
     strcat(pid,"Start!\n");
     write(1,pid,strlen(pid));
 }
 
 //============================================================================= 
 int main()
 {
 int output,
     shmfd,
     semid2;
 //============================================================================= 
 //Open FIFO for writing, make i/ore-direction
 while((output=open("/tmp/output.FIFO", O_WRONLY))<0);
 dup2(output,1);
 dup2(output,2);
 //============================================================================= 
 //Open semaphore set
 while((semid2=semget(ftok("/tmp/inter.SEM",0),3,(SEM_R>>6)|(SEM_A>>6)|mode))<0) 
 ;
 //============================================================================= 
 //Creating shared memory object
 shm_unlink("/tmp/fone.SHM");
 if((shmfd=shm_open("/tmp/fone.SHM",O_RDWR|O_CREAT|O_EXCL,mode))<0)
     {perror("fone (shm_open)"); exit(1);}
 
 ftruncate(shmfd,sizeof(struct shmstruct));
 ptr=mmap(NULL,sizeof(struct shmstruct),PROT_READ|PROT_WRITE,MAP_SHARED,shmfd,0);
 
 ptr->count=0;
 
 close(shmfd);
 //=============================================================================
 }
                                                      До новых встреч, All!
 --- Торчу от Oasis - Cloudburst
  * Origin: Осторожно! Порнография с 25 кадром травмирует детей (2:5022/103.46)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Need Help!   Sergey Agafonov   29 May 2005 15:01:36 
 Re: Need Help!   Max Dmitrichenko   30 May 2005 10:40:33 
Архивное /ru.linux/39064299a13c.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional