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

Рекомендуемые сообщения

Опубликовано

здравствуйте!

недавно начал программировать под 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);
}

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...