) file1의 내용을 fifo를 통해 다른 file2에 복사하려고합니다. FIFO에서 다시 쓰고 싶을 처음 네 글자 (file1에서 fifo로 내용을 쓸 때 이전에는 읽는 동안이 아니라). 그리고 나서 file2에도 복사합니다. 그러나 처음 네 글자는 뒤에 붙지 않지만 중간에 무작위로 삽입됩니다. 터미널에, 내가 실행하면 내가 b.txt하는 a.txt이 복사 할FIFO에서 동시에 읽고 쓰기 (
$ ./a.out a.txt이
b.txt 내 코드는 지금int main(int argc, char* argv[]) {
int fdes,fdes1;
pid_t pid;
ssize_t numRead;
char readBuff[1];
char writeBuff[1];
int readCounter;
int c=0;
umask(0);
if (mkfifo("ajjp.e",0666) == -1 /*make the fifo*/
&& errno != EEXIST)
{}
if(argc < 3) {
printf("Atleast need 2 params ");
exit(1);
}
int to_copy = open(argv[1], 0);/* file from which contents are to be copied */
int oo = creat(argv[2], 0666);/* file created where we've to write contents*/
if (to_copy == -1 ) {
printf("Opening file failed ");
exit(1);
}
if ((pid = fork()) < 0) /* child process is made*/
perror("fork error");
/* in parent process,I'm cwriting contents of file1 to fifo character by character */
else if(pid>0)
{
fdes = open("ajjp.e", O_WRONLY);
while((readCounter = read(to_copy, readBuff, sizeof(readBuff)) > 0)) {
write(fdes, readBuff, sizeof(readBuff));
}
close(to_copy);
}
/* now, in child process, I opened its read end then I'm reading contents from fifo and writing it to file2(i.e copy_to here) but for first four characters(c< 5 here), I'm writing them to fifo also by opening its write end. */
else
{
fdes1 = open("ajjp.e", O_RDONLY);
fdes = open("ajjp.e", O_WRONLY);
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
printf("signal");
int copy_to = open(argv[2], 0666);/* opened the file where we've to write*/
if (copy_to == -1 ) {
printf("Opening file failed ");
exit(1);
}
for(;;) {
c++;
numRead = read(fdes1, readBuff, sizeof(readBuff));/* reading from read end of fifo*/
if (numRead == 0)
break;
/* write to the file2*/
if (write(copy_to, readBuff, numRead) != numRead)
{}
/* for first 4 characters, I am rewriting to the back of fifo*/
if(c<5)
{
write(fdes,readBuff,sizeof(readBuff));
}
/*after writing those 4 characters, write end I've closed*/
if(c==5)
close(fdes);
}
close(fdes);
close(fdes1);
}//end else
return 0;
}
입니다 b.txt에는 a.txt와 문자 사이에 임의로 삽입 된 처음 4자를 포함합니다.
코드 서식을 지정할 수 있습니까? 현재 진행되고있는 일을 이해하는 것은 정말 어렵습니다. – marko
몇 가지 의견을 추가했습니다. 아직 해독 할 수 없다면 알려주세요. –
@marko, 실제로 나는 fork()를 사용할시기와 사용할지 여부를 알지 못합니다. 또한 FIFO는 다른 프로세스가 쓰기를 위해 열지 않을 때까지 끝 블록을 읽습니다. 그 반대의 경우도 마찬가지입니다. 그래서, 나는 두 프로세스 (자식과 부모)가 읽기와 쓰기를 수행 할 수 있도록 자식 프로세스를 생성하려고 생각했다. 그러나 나는 자식 과정에서 나는 둘 다 읽고 쓰고 있다는 것을 알지 못합니다. –