Siemka, mam problem odnośnie linuxa i C, potrzebuje zatrzymać program na sygnał SIGUSR1 (proces zatrzymany wysyła sygnał do pozostałych i je zatrzymuje), oraz wznowić na SIGUSR2... Najlepszą opcją wydaje się być pause() ale niezbyt chce mi to działać.
Dotychczas działa zatrzymanie wszystkich procesów kiedy PID jakikolwiek podam, z wyjątkiem procesu macierzystego, ten nie chce się 'zatrzymać'...
Nie działa wznawianie zaś np. Zatrzymuje p1, i wznowić go moge tylko podając p1 pid, a potrzebuje go wznowić z pid2 pid3 [...].
Prosze kod:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <semaphore.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
int mpid, pid1, pid2, pid3, shmid;
sem_t *sem1;
int zatrzymaj = 0;
int signo;
sigset_t set;
void zakonczPrace(int sig){
psignal(sig,"\nOtrzymalem sygnal");
kill(pid1, SIGINT);
kill(pid2, SIGINT);
kill(pid3, SIGINT);
usleep(100);
shmctl(shmid, IPC_RMID, NULL);
sem_destroy(sem1);
exit(0);
return;
}
void zakonczPraceDzieci(int sig){
kill(mpid, SIGINT);
usleep(100);
exit(0);
return;
}
void stopM(int sig){
psignal(sig,"\nOtrzymalem sygnal, STOP!");
kill(pid1, SIGUSR1);
kill(pid2, SIGUSR1);
kill(pid3, SIGUSR1);
sigemptyset(&set);
sigaddset(&set, SIGUSR2);
pause();
return;
}
void stopD(int sig){
kill(mpid, SIGUSR1);
sigemptyset(&set);
sigaddset(&set, SIGUSR2);
pause();
return;
}
int main(int argc, int *argv[]){
mpid = getpid();
printf("PPM rozpoczyna prace: %i\n", getpid());
signal(SIGINT, zakonczPrace);
signal(SIGUSR1,stopM);
if((pid1=fork())){
if((pid2=fork())){
if((pid3=fork())){
}else{
//PP3
signal(SIGINT,zakonczPraceDzieci);
signal(SIGUSR1,stopD);
}
}
else {
//PP2
signal(SIGINT,zakonczPraceDzieci);
signal(SIGUSR1,stopD);
}
}
else {
//PP1
signal(SIGINT,zakonczPraceDzieci);
signal(SIGUSR1,stopD);
}
}
return 0;
}