|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/39064299a13c.html, оценка из 5, голосов 10
|