Текст программы и результат работы программы

Страницы работы

Содержание работы

Текст программы:

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   вернул
              ненулевое значение.

Похожие материалы

Информация о работе

Тип:
Написанные программы на языках программирования
Размер файла:
181 Kb
Скачали:
0