Мне нужна помощь с кодом Си.
В основном у меня есть n
процессы, которые выполняют некоторый код. Когда они будут почти готовы, я бы хотел, чтобы «Процесс менеджера» (который является основной функцией) отправлял каждому из n
процессов переменную int
, которая может отличаться для каждого процесса.
Моя идея состояла в том, чтобы signal(handler_function, SIGALRM)
как только все процессы начались. Когда процесс почти завершен, он использует kill(getpid(), SIGSTOP)
для ожидания Manager Process
.
По прошествии SIM_TIME
секунд handler_function
отправляет переменную int
на Message Queue
, затем использует kill(process_pid, SIGCONT)
для пробуждения ожидающих процессов. Эти процессы после пробуждения должны получить эту переменную int
из Message Queue
, распечатать ее и просто завершить, позволяя Manager Process
снова взять управление на себя.
Вот код:
/**
* Child Process creation using fork() system call
* Parent Process allocates and initializes necessary variables in shared memory
* Child Process executes Student Process code defined in childProcess function
*/
pid_t runChild(int index, int (*func)(int index))
{
pid_t pid;
pid = fork();
if (pid == -1)
{
printf(RED "Fork ERROR!\n" RESET);
exit(EXIT_FAILURE);
}
else if (pid == 0)
{
int res = func(index);
return getpid();
}
else
{
/*INSIGNIFICANT CODE*/
currentStudent = createStudent(pid);
currentStudent->status = FREE;
students[index] = *currentStudent;
currentGroup = createGroup(index);
addMember(currentStudent, currentGroup);
currentGroup->closed = FALSE;
groups[index] = *currentGroup;
return pid;
}
}
код, выполняемый каждым процессом
/**
* Student Process Code
* Each Student executes this code
*/
int childProcess(int index)
{
/*NOTICE: showing only relevant part of code*/
printf("Process Index %d has almost done, waiting for manager!\n", index);
/* PROGRAM GETS STUCK HERE!*/
kill(getpid(), SIGSTOP);
/* mex variable is already defines, it's a struct implementing Message Queue message struct*/
receiveMessage(mexId, mex, getpid());
printf(GREEN "Student %d has received variable %d\n" RESET, getpid(), mex->variable);
}
Функция обработчика:
* Handler function
* Will be launched when SIM_TIME is reached
*/
void end_handler(int sig)
{
if (sig == SIGALRM)
{
usleep(150000);
printf(RED "Time's UP!\n" RESET);
printGroups();
for(int i = 0; i < POP_SIZE; i++){
mex->mtype = childPids[i];
mex->variable = generateInt(18, 30);
sendMessage(mexId, mex);
//childPids is an array containing PIDs of all previously launched processes
kill(childPids[i], SIGCONT);
}
}
Надеюсь, мой код понятен.
У меня есть проблема, хотя, используя предоставленный код, вся программа застревает при системном вызове kill(getpid(), SIGSTOP)
.
Я также попытался запустить ps
в терминале, и активные процессы не обнаружены.
Я думаю, handler_function
по какой-то причине не отправляет kill(childPids[i], SIGCONT)
системный вызов.
Есть идеи, как решить эту проблему?
Спасибо