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