xellsys
Grünschnabel
Hi,
Ich habe ein Programm geschrieben mit dem der Inhalt zweier Text-dateien unter Linux vertauscht wird. Das ganze lasse ich ueber 2 Prozesse laufen, die miteinander ueber eine unnamed pipe kommunizieren.
Das Problem ist, dass das Programm scheinbar willkuerlich nicht funktioniert.
In einem folder erstell ich 2 Textdateien (a,b) mit Inhalt 'a\nb\nc' und 'x\ny\nz\n' und versuche die zu vertauschen und es klappt. Dann verschiebe ich alle 3 Dateien (a.out, a, b) in einen anderen folder und es geht nicht mehr, die beiden Dateien sind danach einfach leer, halt als wenn sie zum schreiben geoeffnet wurden, nur es wurde halt nix reingeschrieben.
Ich hoffe mir kann jemand helfen, vielen dank
Hier ist mein code:
PS: Ausserdem scheint es mir Sonderzeichen in den Textdateien gar nicht zu funktionieren....warum auch immer
Ich habe ein Programm geschrieben mit dem der Inhalt zweier Text-dateien unter Linux vertauscht wird. Das ganze lasse ich ueber 2 Prozesse laufen, die miteinander ueber eine unnamed pipe kommunizieren.
Das Problem ist, dass das Programm scheinbar willkuerlich nicht funktioniert.
In einem folder erstell ich 2 Textdateien (a,b) mit Inhalt 'a\nb\nc' und 'x\ny\nz\n' und versuche die zu vertauschen und es klappt. Dann verschiebe ich alle 3 Dateien (a.out, a, b) in einen anderen folder und es geht nicht mehr, die beiden Dateien sind danach einfach leer, halt als wenn sie zum schreiben geoeffnet wurden, nur es wurde halt nix reingeschrieben.
Ich hoffe mir kann jemand helfen, vielen dank

Hier ist mein code:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <unistd.h>
#include <time.h>
#define line_length 1000
int fd[2],fd2[2];
FILE *file1,*file2,*pipe1,*pipe2;
void clean_up(int sig)
{
close(fd[0]);
close(fd2[0]);
close(fd2[1]);
close(fd[1]);
fclose(pipe1);
fclose(pipe2);
exit(EXIT_SUCCESS);
}
int main(int argc,char* argv[])
{
int opt,pid,check=-2;
char *file1_path = NULL,*file2_path = NULL,line1[line_length],line2[line_length];
(void) signal(SIGHUP, clean_up);
(void) signal(SIGINT, clean_up);
(void) signal(SIGQUIT, clean_up);
(void) signal(SIGTERM, clean_up);
if(argc != 3)
{
fprintf(stderr,"wrong number of arguments\n");
return 1;
}
file1_path = argv[1];
file2_path = argv[2];
if(pipe(fd))
{
fprintf(stderr,"pipe creation failure");
return 1;
}
if(pipe(fd2))
{
fprintf(stderr,"pipe2 creation failure");
}
pid = fork();
switch(pid)
{
case -1: fprintf(stderr,"process failure\n"); break;
case 0: //CHILD PROCESS:READ STRING FROM FILE -> PUT STRING INTO PIPE
fprintf(stdout,"child process established\n");
close(fd[0]); // pipe 1 zum lesen schliessen
close(fd2[0]); // pipe 2 zum lesen schliessen
if(!(file1 = fopen(file1_path,"r")))
fprintf(stderr,"fehler beim erstellen der datei 1 zum lesen"); //datei 1 zum lesen oeffnen
if(!(file2 = fopen(file2_path,"r")))
fprintf(stderr,"fehler beim erstellen der datei 2 zum lesen"); //datei 2 zum lesen oeffnen
if((pipe1 = fdopen(fd[1],"w"))==NULL) // pipe 1 zum schreiben oeffnen
{
fprintf(stderr,"writepipe1 creation failure");
return 1;
}
if((pipe2 = fdopen(fd2[1],"w"))==NULL) // pipe 2 zum schreiben oeffnen
{
fprintf(stderr,"writepipe2 creation failure");
return 1;
}
while(check)
{
if(fgets(line1,line_length,file1)) // zeile aus datei 1 lesen
{
fputs(line1,pipe1); // diese zeile in die pipe1 schreiben
fflush(pipe1);
}
else if(check == -1) check = 0;
else if(check != 0) check = -1;
if(fgets(line2,line_length,file2)) // zeile aus datei 2 lesen
{
fputs(line2,pipe2); // diese zeile in die pipe 2 schreiben
fflush(pipe2);
}
else if(check == -1) check = 0;
else if(check != 0) check = -1;
//write(fd[1],line,line_length);
}
close(fd[1]);
close(fd2[1]);
fclose(file1);
fclose(file2);
break;
default: //FATHER PROCESS: READ STRING FROM PIPE -> PUT STRING INTO FILE
fprintf(stdout,"father process established\n");
close(fd[1]); // pipe 1 zum schreiben schliessen
close(fd2[1]); // pipe 2 zum schreiben schliessen
if(!(file1 = fopen(file1_path,"w+")))
fprintf(stderr,"fehler beim erstellen der datei 1 zum schreiben"); // datei 1 zum schreiben oeffnen
if(!(file2 = fopen(file2_path,"w+")))
fprintf(stderr,"fehler beim erstellen der datei 2 zum schreiben");; // datei 2 zum schreiben oeffnen
if((pipe1 = fdopen(fd[0],"r"))==NULL) // pipe 1 zum lesen oeffnen
{
fprintf(stderr,"readpipe creation failure");
}
if((pipe2 = fdopen(fd2[0],"r"))==NULL) // pipe 2 zum lesen oeffnen
{
fprintf(stderr,"readpipe creation failure");
}
while(check)
{
if(fgets(line1,line_length,pipe1)) // zeile aus pipe 1 lesen
{
fputs(line1,file2); // diese zeile in datei 1 schreiben
//fputs(line1,stdout);
fflush(file2);
}
else if(check == -1) check = 0;
else if(check != 0) check = -1;
if(fgets(line2,line_length,pipe2)) // zeile aus pipe 2 lesen
{
fputs(line2,file1); // diese zeile in datei 2 schreiben
//fputs(line2,stdout);
fflush(file1);
}
else if(check == -1) check = 0;
else if(check != 0) check = -1;
//write(fd[1],line,line_length);
}
close(fd[0]);
close(fd2[0]);
fclose(file1);
fclose(file2);
break;
}
fclose(pipe1);
fclose(pipe2);
if(pid!=0) fprintf(stdout,"file copy successfull\n");
return 0;
}
Zuletzt bearbeitet: