我在分配学校时遇到了麻烦,目前代码适用于将孩子获取并将文本添加到新文本文件中。 除了父文件,文件已成功创建,但文件为空。
我的文本文件看起来像这样
要复制到child1的1个文本。
0要复制到父级的文本
我的代码在
之下int main(){
int c1,c2,c3 ;
FILE *fp1,*fpm, *fp2;
char str1[100];
char str2[100];
fp1 = fopen("test.txt","r");
fpm = fopen("mainlog.txt","w");
fp2 = fopen("child1log.txt","w");
c1 = fork();
if(c1 == 0){
printf("child Process\n");
while ((fgets(str1,80,fp1))!=NULL){
if(str1[0]=='1'){
fputs(str1+1,fp2);
}
}
}
else{
printf("This is parent Process\n");
while ((fgets(str,80,fp1))!=NULL){
if(str[0]=='0'){
fputs(str+1,fpm);
}
}
}
return 0;
}
帮助表示赞赏。
答案 0 :(得分:1)
底层fp1
的打开文件描述符指向打开的文件描述(是的 - 这是POSIX术语;请参阅open()
)。在fork()
之后,每个进程都有自己的文件打开文件描述符,但它们共享打开的文件描述。读取位置是打开文件描述的属性。
因此,两个进程中的一个进程首先读取,并且它也移动另一个进程的读指针。由于第一个进程读取文件中的所有数据,因此第二个进程立即获得EOF。
您可以在fork()
之后打开文件进行阅读;至少,这可能是避免麻烦的最简单方法。或者,这些过程可以在阅读之前回放。首先,这将是一个无操作,但对另一个,它将有所作为。在这种情况下,您也可以在fork之前读取,它将使用数据填充fp1
的缓冲区,并且两个进程都将看到读取的内容。但这可能算作作弊。