Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Программирование на С под Линукс: процессы, сигналы.

69K
09 апреля 2011 года
Valk
1 / / 09.04.2011
Задание:
Нужно создать дерево процессов, организовать непрерывную передачу сигналов.
дерево: 1->(2,3) 3->4 4->(5,6) 6->7 7->8. Сигналы: 1->2 SIGUSR1, 2->(3,4)SIGUSR2, 4->5 SIGUSR1, 3->6 SIGUSR1, 6->7 SIGUSR1, 7->8 SIGUSR1, 8->1 SIGUSR1.
Запись вида: 2->(3,4) SIGUSR2 означает, что процесс 2 посылает дочерним процессам 3,4 одновременно (т.е. за один вызов kill()) сигнал SIGUSR2. После передачи 101 –го по счету сигнала SIGUSR родительский процесс посылает сыновьям сигнал SIGTERM и ожидает завершения всех сыновей, после чего завершается. Сыновья, получив сигнал SIGTERM, завершают работу с выводом на консоль сообщения вида:

pid ppid завершил работу после X-го сигнала SIGUSR1 и Y-го сигнала SIGUSR2

где X,Y – количество посланных за все время работы данным сыном сигналов SIGUSR1 и SIGUSR2

Каждый процесс в процессе работы выводит на консоль информацию в следующем виде:
N pid ppid послал/получил USR1/USR2 текущее время (мксек)


вот черновой вариант:

#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>

FILE *fp;

void my1 (int sig)
{
int pid,i;
if (!(fp=fopen("pid.txt","r")))
{
perror ("Error opening file");
exit(1);
}
for (i=0;i<2;i++)
fscanf (fp,"%d",&pid);
fclose(fp);

static caunt=0;
printf ("%d %d get %s %d",getpid(),getppid(),sig,time());
caunt++;
kill(pid,SIGUSR1); //отправляет сигнал 2-му процессу
}

void my2 (int sig)
{
printf ("%d %d get %s %d",getpid(),getppid(),sig,time());
int pid,i;
if (!(fp=fopen("pid.txt","r")))
{
perror ("Error opening file");
exit(1);
}
for (i=0;i<3;i++)
fscanf (fp,"%d",&pid);
fclose(fp); // нужно отправить 2сигнал 3-му и 4-му
kill(pid,SIGUSR2);
}

void my3 (int sig)
{
int pid,i;
if (!(fp=fopen("pid.txt","r")))
{
perror ("Error opening file");
exit(1);
}
for (i=0;i<6;i++)
fscanf (fp,"%d",&pid);
fclose(fp);
kill(pid,SIGUSR1);
printf ("%d %d get %s %d",getpid(),getppid(),sig,time());

}

void my4 (int sig)
{
printf ("%d %d get %s %d",getpid(),getppid(),sig,time());
int pid,i;
if (!(fp=fopen("pid.txt","r")))
{
perror ("Error opening file");
exit(1);
}
for (i=0;i<5;i++)
fscanf (fp,"%d",&pid);
fclose(fp);
kill(pid,SIGUSR1);
}

void my5 (int sig)
{
printf ("%d %d get %s %d",getpid(),getppid(),sig,time());

}

void my6 (int sig)
{
printf ("%d %d get %s %d",getpid(),getppid(),sig,time());
int pid,i;
if (!(fp=fopen("pid.txt","r")))
{
perror ("Error opening file");
exit(1);
}
for (i=0;i<7;i++)
fscanf (fp,"%d",&pid);
fclose(fp);
kill(pid,SIGUSR1);

}

void my7 (int sig)
{
printf ("%d %d get %s %d",getpid(),getppid(),sig,time());
int pid,i;
if (!(fp=fopen("pid.txt","r")))
{
perror ("Error opening file");
exit(1);
}
for (i=0;i<8;i++)
fscanf (fp,"%d",&pid);
fclose(fp);
kill(pid,SIGUSR1);

}

void my8 (int sig)
{
printf ("%d %d get %s %d",getpid(),getppid(),sig,time());
int pid,i;
if (!(fp=fopen("pid.txt","r")))
{
perror ("Error opening file");
exit(1);
}
fscanf (fp,"%d",&pid);
fclose(fp);
kill(pid,SIGUSR1);
}


int main ()
{
fp=fopen ("pid.txt","w");
if (!fp)
{
perror ("Error opening file");
return EXIT_FAILURE;
}
fclose (fp);
int father=getpid();
signal(SIGUSR1,my1);
if (fork()==0)
{

signal(SIGUSR1,my1);
printf ( "I'm 1 process, my pid = %d, pid my parrent = %d \n",getpid(),getppid());
if (!(fp=fopen("pid.txt","a")))
{
perror ("Error opening file");
return EXIT_FAILURE;
}
fprintf (fp,"%d\n",getpid());
fclose(fp);


if (fork()==0)
{
struct sigaction sa;
sa.sa_handler=my2;
sigaction (SIGUSR1,&sa,0);
// signal(SIGUSR1,my2);
printf ( "I'm 2 process, my pid = %d, pid my parrent = %d \n",getpid(),getppid());
if (!(fp=fopen("pid.txt","a")))
{
perror ("Error opening file");
return EXIT_FAILURE;
}
fprintf (fp,"%d\n",getpid());
fclose(fp);
pause(); // 2 process
}

else
{
sleep(1);
int pid,i;
if (!(fp=fopen("pid.txt","r")))
{
perror ("Error opening file");
return EXIT_FAILURE;
}
for (i=0;i<2;i++)
{
fscanf (fp,"%d",&pid);
}
printf("do kill()*****\n");
kill(pid,SIGUSR1);
printf("\nposle kill()*****\n");

fclose(fp);


if (fork()==0)
{
signal(SIGUSR2,my3);
printf ( "I'm 3 process, my pid = %d, pid my parrent = %d \n",getpid(),getppid());
if (!(fp=fopen("pid.txt","a")))
{
perror ("Error opening file");
return EXIT_FAILURE;
}
fprintf (fp,"%d\n",getpid());
fclose(fp);


if (fork()==0)
{
signal(SIGUSR2,my4);
printf ( "I'm 4 process, my pid = %d, pid my parrent = %d \n",getpid(),getppid());
if (!(fp=fopen("pid.txt","a")))
{
perror ("Error opening file");
return EXIT_FAILURE;
}
fprintf (fp,"%d\n",getpid());
fclose(fp);

if (fork()==0)
{
signal(SIGUSR1,my5);
printf ( "I'm 5 process, my pid = %d, pid my parrent = %d \n",getpid(),getppid());
if (!(fp=fopen("pid.txt","a")))
{
perror ("Error opening file");
return EXIT_FAILURE;
}
fprintf (fp,"%d\n",getpid());
fclose(fp);
pause(); // 5 process
}

else
{
sleep(2);
if (fork()==0)
{
signal(SIGUSR1,my6);
printf ( "I'm 6 process, my pid = %d, pid my parrent = %d \n",getpid(),getppid());
if (!(fp=fopen("pid.txt","a")))
{
perror ("Error opening file");
return EXIT_FAILURE;
}
fprintf (fp,"%d\n",getpid());
fclose(fp);

if (fork()==0)
{
signal(SIGUSR1,my7);
printf ( "I'm 7 process, my pid = %d, pid my parrent = %d \n",getpid(),getppid());
if (!(fp=fopen("pid.txt","a")))
{
perror ("Error opening file");
return EXIT_FAILURE;
}
fprintf (fp,"%d\n",getpid());
fclose(fp);


if (fork()==0)
{
signal(SIGUSR1,my8);
printf ( "I'm 8 process, my pid = %d, pid my parrent = %d \n",getpid(),getppid());
if (!(fp=fopen("pid.txt","a")))
{
perror ("Error opening file");
return EXIT_FAILURE;
}
fprintf (fp,"%d\n",getpid());
fclose(fp);
pause(); // 8 process
}
pause(); // 7 process
}
pause(); //6 process
}
}
pause(); //4 process
}
pause(); // 3 process
}

}

pause(); // 1 process
}


int j;
for(j=0; j<8;j++)
wait();

return 0;
}


Не работает kill(), не отправляет сигнал, не могу понять в чём ошибка. Просто не работает. Процессы создаю по порядку, записываю в файл их пиды, потом нужный пид для отправки сигнала считываю с файла.

Помогите!!! Почему не работает???
285
10 апреля 2011 года
Romik
479 / / 24.11.2002
Код оформи тегами [ code=c] [ /code ] и добавь комментариев.
87
11 апреля 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: Valk
вот черновой вариант


Так не пойдёт - много букв. Кто же это будет читать? Надо вначале рассмотреть вариант с одним дочерним процессом.

Цитата: Valk
Не работает kill(), не отправляет сигнал, не могу понять в чём ошибка. Просто не работает.
...
Помогите!!! Почему не работает???


Что возвращает kill() ? Ноль или -1? Если -1, то можно пытаться анализировать коды ошибок.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог