Пропустить навигацию.
Главная

первая лабораторная (исходник) по UNIX системам для студента мифи 3 курса - самый раз)))

################################LAB2.c################################
#include
#include
#include
#include

char *p="./alpha_gamma";
pid_t pids[12];
int PidsPosition=0;
int i,k;
int flag=1;
int number[25]={1,2,3,4,5,6,7,8,9,0,10,11,1,10,2,11,1,2,2,3,1,2,3,4,5};
int NumberPosition=0;
int retmax=0;
int NumLoops=0;

void FatalExit(int ProcessesStarted, int ExitCode)
{
int tmp;
//printf("Fatal exit %i!\n",getpid());
tmp=ProcessesStarted;
//printf("Processes started: %i\n",ProcessesStarted);
for (;ProcessesStarted>=0;ProcessesStarted--) {
// printf("Killing process %i\n",pids[ProcessesStarted]);
kill(pids[ProcessesStarted],SIGKILL);
}
for (;tmp>=0;tmp--) wait(&k);
exit(ExitCode);
}

void handleralarm(int sig)
{
if (NumberPosition<25) flag++;
}

void handlerusr2(int sig)
{
FatalExit(PidsPosition-2,26);
}

void handleralarm2(int sig)
{
int i;
for (i=0;i<12;i++) kill(pids[i],SIGKILL);
for (i=0;i<12;i++) wait(&k);
exit(0);
}

void start(char * code)
{
switch (pids[PidsPosition++]=fork()) {
case 0:execl(p,p,code,NULL);
kill(getppid(),SIGUSR2);
exit(26);
case -1:FatalExit(PidsPosition-2,26);
}
//printf("Created process %i\n",pids[PidsPosition-1]);
}

int main() {
setvbuf(stdout,(char *)NULL,_IONBF,0);
signal(SIGALRM,&handleralarm);
signal(SIGUSR2,&handlerusr2);
//printf("PID=%i\n",getpid());
char tmp[2];
tmp[1]=0;
for (tmp[0]='0';tmp[0]<='9';tmp[0]++) start(tmp);
start("A");
start("B");
usleep(1000);
sleep(1);
int StartTime=time(NULL);
while (NumberPosition<25) {
while (flag) {
kill(pids[number[NumberPosition++]],13);
flag--;
}
if (NumberPosition>=25) break;
sleep(1);
if ((time(NULL)-StartTime)>30) FatalExit(11,26);
}
for (i=0;i<12;i++) kill(pids[i],SIGINT);
signal(SIGALRM,&handleralarm2);
alarm(10);
for (i=0;i<12;i++) {
wait(&k);
k>>=8;
if (k>retmax) retmax=k;
}
return retmax;
}

################################alpha_gamma.c################################
#include
#include
#include

char c[2];
int kol=0;
pid_t ppid;

void handler13(int sig)
{
printf(c);
kol++;
kill(ppid,SIGALRM);
}

void handlerint(int sig)
{
exit(kol);
}

int main(int argc, char * argv[]) {
ppid=getppid();
if (argc<=1) c[0]=' ';
else c[0]=argv[1][0];
c[1]=0;
signal(13,&handler13);
signal(SIGINT,&handlerint);
setvbuf(stdout,(char *)NULL,_IONBF,0);
while(1) pause();
}