Текст программы:
1) Laba2.c
#include <stdio.h>
#include <string.h>
#include <sys/signal.h>
#include <sys/wait.h>
#include <time.h>
#include <sys/types.h>
#include <sys/errno.h>
void Event(int sig){
// printf("++++++++signal:%d+++++++++++",sig);
if( WIFEXITED(sig)){
printf( "Main Procces finished with message:%s\n",sys_errlist[WEXITSTATUS(sig)]);
}
if( WIFSIGNALED(sig)){
switch (WTERMSIG(sig)){
case SIGTSTP:{
signal(SIGTSTP,SIG_DFL);
signal(SIGCONT,*Event);
raise(SIGTSTP);
printf( "Main Procces stoped with signal:%d\n",WTERMSIG(sig));
break;
};
case SIGCONT:{
printf( "Main Procces continued with signal:%d\n",WTERMSIG(sig));
signal(SIGTSTP,*Event);
signal(SIGCONT,SIG_DFL);
raise(SIGCONT);
break;
}
default: {
signal(WTERMSIG(sig),SIG_DFL);
printf( "Main Procces killed with signal:%d\n",WTERMSIG(sig));
if(WCOREDUMP(sig)) printf( "Maked core\n" );
raise(WTERMSIG(sig));
};
};
};
if( WIFSTOPPED(sig)){
printf( "Main Procces stoped with sinal:%d\n",WSTOPSIG(sig));
}
}
int main(int argc, char* argv[],char* envp[]){
signal(SIGINT,*Event);
signal(SIGQUIT,*Event);
sigset(SIGTERM,*Event);
signal(SIGTSTP,*Event);
sigset(SIGABRT,*Event);
sigset(SIGILL,*Event);
sigset(SIGFPE,*Event);
int PN=0;
int i=0;
char *t[4];
int PID=getpid();
int status;
for(i=5;i<9;i++){
t[i-5]=argv[i];
}
if(t[0]==NULL) {
for(i=0;i<4;i++){
t[i]="2";
}
}
if (argc<4){
printf("No arguments\n");
return 1;
};
for (i=1;i<5;i++){
if (PID!=0){
PN=0;
if (atoi(argv[i])==1){
PN=1;
PID=fork();
};
if (atoi(argv[i])==2){
PN=2;
PID=fork();
};
if (atoi(argv[i])==3){
PN=3;
PID=fork();
};
if (atoi(argv[i])==4){
PN=4;
PID=fork();
};
};
};
if (PID==0){
time_t clock=time(NULL);
if (PN==1){
printf("PID:%i PPID:%i One Time:%s\n",getpid(),getppid(),ctime(&clock));
char *argvc[20];
argvc[0]="";
argvc[1]="1";
argvc[2]=t[0];
argvc[3]=NULL;
execv("laba2_1",argvc);
exit(errno);
};
if (PN==2){
printf("PID:%i PPID:%i Two Time:%s\n",getpid(),getppid(),ctime(&clock));
execl("laba2_1","","2",t[1],NULL);
exit(errno);
};
if (PN==3){
printf("PID:%i PPID:%i Three Time:%s\n",getpid(),getppid(),ctime(&clock));
char *argvc[20];
argvc[0]="";
argvc[1]="3";
argvc[2]=t[2];
argvc[3]=NULL;
execvp("/home/po21/Ghost/Laba2/Programm/laba2_1",argvc);
exit(errno);
};
if (PN==4){
printf("PID:%i PPID:%i Four Time:%s\n",getpid(),getppid(),ctime(&clock));
execlp("/home/po21/Ghost/Laba2/Programm/laba2_1","","4",t[3],NULL);
exit(errno);
};
}
else {
while((PID = wait(&status)) > 0){
if( WIFEXITED(status)){
printf( "Thread PID:%d finished with message:%s\n",PID,sys_errlist[WEXITSTATUS(status)]);
}
if( WIFSIGNALED(status)){
printf( "Thread PID:%d killed with signal:%d\n",PID,WTERMSIG(status));
if(WCOREDUMP(status)) printf( "Maked core\n" );
/* core - образ памяти для отлатчика adb */
};
if( WIFSTOPPED(status)){
printf( "Thread PID:%d stoped with sinal:%d\n",PID,WSTOPSIG(status));
}
if (errno>0 && errno<sys_nerr) printf("Error %s in thread %i\n",sys_errlist[errno],getpid());
}
};
return 0;
Результат работы программы:
PID:3191 PPID:3190 One Time:Thu Mar 24 20:42:37 2005
I am programm#1, I wait 1 sec
PID:3192 PPID:3190 Two Time:Thu Mar 24 20:42:37 2005
PID:3193 PPID:3190 Three Time:Thu Mar 24 20:42:37 2005
PID:3194 PPID:3190 Four Time:Thu Mar 24 20:42:37 2005
Thread PID:3193 finished with message:No such file or directory
Thread PID:3194 finished with message:No such file or directory
I am programm#2, I wait 2 sec
Thread PID:3191 finished with message:Success
Thread PID:3192 finished with message:Success
WIFEXITED(status)
не равно нулю, если дочерний процесс нормально
завершился.
WEXITSTATUS(status)
возвращает восемь младших битов возвращаемого
значения завершившегося дочернего процесса. Эти
биты могли быть установлены в аргументе функции
exit() или в аргументе оператора return в функции
main(). Этот макрос можно использовать, только
если WIFEXITED вернул ненулевое значение.
WIFSIGNALED(status)
возвращает истинное значение, если дочерний процесс
завершился из-за неперехваченного сигнала.
WTERMSIG(status)
возвращает номер сигнала, который привел к
завершению дочернего процесса. Этот макрос можно
использовать только если WIFSIGNALED вернул
ненулевое значение.
WIFSTOPPED(status)
возвращает истинное значение, если дочерний
процесс, из-за которого функция вернула управление,
в настоящий момент остановлен; это возможно только
если использовался флаг WUNTRACED.
WSTOPSIG(status)
возвращает номер сигнала, из-за которого дочерний
процесс был остановлен. Этот макрос можно
использовать только если WIFSTOPPED вернул
ненулевое значение.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.