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