Привет Я эту проблему решить с помощью функциональной программы в С.системных вызовов в сигналы C и вилкой
«Напишите программу C, где процесс создания F childprocess C. childprocess C ожидает пользователя для ввода пароля, если он правильно отправляет сигнал SIGUSR1 отцу, если после 3 попыток пароль все еще некорректен, он отправит сигнал SIGUSR2 отцу и прекратит, если он получит от отца сигнал SIGUSR1, должен прекратить просмотр " тайм-аут "
Его отец через 30 секунд (если он не получил никакого сигнала от ребенка) должен отправить сигнал SIGUSR1 ребенку и завершить его с выходом (1), если он получает сигнал SIGUSR1 nal должен заканчиваться выходом (0); .. Если он получает SIGUSR2 сигнал должен заканчиваться с выходом (2)»
Я пытаюсь решить, но я застрял Это то, что я сделал:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
void fatherprocess(int mysignal){
if (mysignal == SIGUSR1) {
printf("ACCESS GRANTED!\n");
exit(0);
}
if (mysignal == SIGUSR2){
printf("ACCESS DISCARDED! More than 3 tentatives!\n");
exit(2);
}
}
void childprocess(int mysignal){
if (mysignal == SIGUSR1) {
printf("TIMEOUT\n");
exit(1);
}
}
int main(int argc, char *argcv[]){
int fatherpid, childpid;
char enteredpassword[], password[] = "test";
int i =0;
unsigned int time_to_sleep = 30;
fatherpid = getpid();
childpid = fork();
if (childpid == 0) {
printf("Child Process waiting for a password\n");
while (1){
if (i < 3) {
printf("Enter Password: ");
scanf("%s", enteredpassword);
if (enteredpassword == password)
signal(SIGUSR1, fatherprocess);
} else {
signal(SIGUSR2, fatherprocess);
exit(1);
}
i++;
}
} else {
printf("Father Process\n");
while(time_to_sleep){
time_to_sleep = sleep(time_to_sleep);
signal(SIGUSR1, childprocess);
}
}
return 0;
}
I «ве отредактирован мою программу таким образом:.
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
void fatherprocess(int mysignal, int fatherpid){
if (mysignal == SIGUSR1) {
printf("ACCESS GRANTED!\n");
kill(fatherpid, SIGUSR1);
exit(0);
}
if (mysignal == SIGUSR2){
printf("ACCESS DISCARDED! More than 3 tentatives!\n");
kill(fatherpid, SIGUSR2);
exit(2);
}
}
void childprocess(int mysignal, int childpid){
if (mysignal == SIGUSR1) {
printf("TIMEOUT\n");
kill(childpid, SIGUSR1);
exit(1);
}
}
int main(int argc, char *argcv[]){
int fatherpid, childpid;
char enteredpassword[] = "test", password[] = "test";
int i =0;
unsigned int time_to_sleep = 30;
fatherpid = getpid();
childpid = fork();
if (childpid == 0) {
printf("Child Process waiting for a password\n");
while (1){
if (i < 3) {
printf("Enter Password: ");
scanf("%s", enteredpassword);
if (strcmp(enteredpassword, password) == 0)
fatherprocess(SIGUSR1, fatherpid);
} else {
fatherprocess(SIGUSR2, fatherpid);
exit(1);
}
i++;
}
} else {
printf("Father Process\n");
while(time_to_sleep){
time_to_sleep = sleep(time_to_sleep);
childprocess(SIGUSR1, childpid);
}
}
return 0;
}
Сейчас он работает отлично, но я не знаю, если я уважал текст упражнения
это полный код? вы не установили обработчики сигналов. – Nish
Это не полный beacuse, я не знаю, как установить обработчики сигналов :(вы можете мне помочь? – JoKeRxbLaCk
Нужно ли использовать kill systemcall вместо сигнала? – JoKeRxbLaCk