Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

UNIX + C: Передача сообщения сигналами

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Artlav



Зарегистрирован: 21.12.2005
Сообщения: 1

СообщениеДобавлено: Ср Дек 21 2005 19:43    Заголовок сообщения: UNIX + C: Передача сообщения сигналами Ответить с цитатой

Задача - передать сообщение из одного процесса в группу процессов используя только сигналы.

Попробовал - не получилось.

Подскажите пожауйста, где ошибка или как делать.
Заранее благодарен.

Код:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

volatile pid_t prcs[32768];
int pcnt,cp;
char msg[1024];


volatile char mc,mp;

void sigu1h(int signo)
{
 mp++;       
 printf("mp=%d\n",mp);
 if(mp==8) {
  printf("msg=%cn\n",mc);
  mp=0;
  mc=0;
 }       
 kill(-4432,SIGUSR1); 
}
void sigu2h(int signo)
{     
 mc+=1<<mp;         
 mp++;       
 printf("mp=%d\n",mp);
 if(mp==8) {
  printf("msg=%cn\n",mc);
  mp=0;
  mc=0;
 }               
 kill(-4432,SIGUSR1);
}

int procr(int id)
{
 signal(SIGUSR1,sigu1h);
 signal(SIGUSR2,sigu2h);
 
 while(1){
  pause();
 }
}



volatile int flg,flag=0;

void siguhs(int signo)
{
 flag=1;
 flg++;
 printf("flg=%d\n",flg);
}

void procsd()
{
 int j,m,s;

 s=0x45;   ///Типа пробного сообщения.
 flg=pcnt;               
 //signal(SIGUSR1,siguhs);
 flag=1;
 
 while(getpgid(getpid())!=4432){}   
     
 sigset_t mask, oldmask;
 sigemptyset(&mask);
 sigaddset(&mask,SIGUSR1);
 signal(SIGUSR1,siguhs);
 
 for(j=0;j<8;j++){
  sigprocmask(SIG_BLOCK, &mask, &oldmask);
  while(!flag)sigsuspend(&oldmask);
  flag=0;
  sigprocmask(SIG_UNBLOCK, &mask, NULL); 
  printf("flgh=%d\n",flg);
  if(flg>=pcnt){
   flg=0;
   m=s&(1<<j);
   kill(-4433,SIGUSR1*(m==0)+SIGUSR2*(m!=0));
  }
 }
 exit(0);
}           

int main(int argc,char *argv[])
{
 int pid;
 int i;
 if (argc!=3) {printf("p3: Wrong input.\n"); return 1;}
 sscanf(argv[1],"%d",&pcnt);
 strcpy(msg,argv[2]);
 
 cp=0;
 
 for (i=0;i<pcnt;i++) if (!(pid=fork())) {
  procr(i);
 }else{
  cp=pid;
  prcs[i]=pid;   
  setpgid(pid,4433);
 }       
         
 if ((pid=fork())==0){procsd();}   
 setpgid(pid,4432);
 while (pid!=wait(&i)){}

 //sleep(1);
 //kill(-4433,SIGKILL);

 
 
 
 return 0;
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...