|
|
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
|