Перейти к содержанию

ivan133

Members
  • Постов

    1
  • Зарегистрирован

  • Посещение

    Никогда

Достижения ivan133

  1. здравствуйте! недавно начал программировать под linux,вроде все было ясно. Но получил задание : Написать программу, в которой родительский процесс создает потомка. В родительском процессе пользователь вводит символы, которые передаются с помощью канала процессу потомку. Потомок записывает полученные символы в файл. В том случае, если пользователь ввел строку «exit», процесс родитель с помощью сигнала информирует потомка об окончании работы. Потомок при получении этого сигнала должен закрыть файл и завершить работу. быстро набрасал алгоритм,реализовал но он почему-то постоянно не работает разные источники дают разные советы... в общем я запутался может кто подскажет,что здесь неправильно? спасибо! вот код #include<unistd.h> #include<stdlib.h> #include<sys/types.h> #include<stdio.h> #include<signal.h> #define DEBUG 1 #define TEMPNAME "out.txt" #define BUFSIZE 30 FILE * fp; int fd[2]; int main(){ extern void exitchl(int sig_num); sigset_t mask; struct sigaction action; pid_t pid,pidP,pidC; int status; char i; char buf[bUFSIZE]=""; char endword[]="exit"; char length=0; char ch,ch1; #if DEBUG long i1=1; #endif memset(&action,0,sizeof(action)); if ((pipe(fd))==-1){ fprintf(stderr,"error\n"); return -1; } while (endword[length++] !=''); length--; #if DEBUG fprintf(stdout,"length %d\n",length); #endif sigemptyset(&mask); sigaddset(&mask,SIGSTOP); sigaddset(&mask,SIGCONT); sigaddset(&mask,SIGUSR1); action.sa_handler=exitchl; action.sa_flags=SA_RESETHAND; if (sigaction(SIGUSR1,&action,NULL)==-1) return-1; pid=fork(); switch (pid){ case -1: fprintf(stderr,"error\n"); exit(-1); break; case 0: close(fd[1]); if ((fp=fopen(TEMPNAME,"w"))==NULL){ fprintf(stderr,"error\n"); return -1; } pidC=getpid(); kill(pidC,SIGSTOP); while(1){ #if DEBUG fprintf(stdout,"child pid=%i iteration %d\n",pidC,i1++); #endif for (i=0;i<BUFSIZE;i++)buf=''; read(fd[0],buf,BUFSIZE); fprintf(stdout,"%s\n",buf); fputs(buf,fp); kill(pidP,SIGCONT); kill(pidC,SIGSTOP); } break; default: close(fd[0]); pidP=getpid(); while (1){ #if DEBUG fprintf(stdout,"Parent pid =%i iteration %d\n",pidP,i1++); #endif fscanf(stdin,"%s",buf); if (strcmp(endword,buf)==0){ #if DEBUG fprintf(stdout,"Parent sent signal=%d\n",SIGUSR1); #endif kill(pidC,SIGUSR1); pidP=wait(&status); #if DEBUG fprintf(stdout,"Parent pid =%i break\n",pidP); #endif close(fd[1]); break; } write(fd[1],buf,strlen(buf)); kill(pidC,SIGCONT); alarm(SIGSTOP);//kill(pidP,SIGSTOP) } break; } return 0; } void exitchl(int sig_num){ #if DEBUG fprintf(stdout,"Child break signal=%d\n",sig_num); #endif close(fd[0]); #if DEBUG fprintf(stdout,"Child: close(fd[0])\n"); #endif if (fclose(fp)!=0) fprintf(stdout,"fclose error!\n");//òóò ïî÷åìó-òî âûëåòàåò //ïèøåòü sigmentation fault #if DEBUG fprintf(stdout,"Child: fclose(fp)\n"); #endif exit(EXIT_SUCCESS); }
×
×
  • Создать...