操作系统概念第九版3.27题
程序员文章站
2022-07-05 08:05:00
...
char*
char* temp;
fgets(temp,100,fp);
不可以,temp此时没有指向一块内存,fgets是写到temp指针指向的内存空间,可以用malloc分配内存空间,(temp此时就是野指针)
char[]
char[]=""
[]里不写具体的n的话,会根据后面的’’ ‘’ 里的长度给数组分配空间,而不是赋值了一个空串!
以上两个都容易产生segement fault!!
feof
windows正常使用就行,unix文件最后没有文件结束符,调用fgets的时候,查看文件剩余的内容,若剩余为0,文件结束符置位,fgets()不读了,若不为空,继续读;所以会导致最后一行读了两次,因为文件读完的时候,文件结束符还是上一次调用fgets的时候,这时候不为空,所以导致又进入了一次循环,然后此时为空,fgets不读了,msg还是上一次读的消息,相当于又读了一次
#include<sys/types.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#define READ_END 0
#define BUFFER_SIZE 10000//可以调整,其实可以得到具体的值,利用fseek()ftell()fread(),发懒没写
#define WRITE_END 1
int main(int argc,char* argv[]){
if(argc!=3){
return 1;
}
char* input=argv[1];
char* copy=argv[2];
char write_msg[BUFFER_SIZE];
char read_msg[BUFFER_SIZE];
char temp[1000];
pid_t pid;
int fd[2];
if(pipe(fd)==-1){
fprintf(stderr,"Pipe failed");
return 1;
}
pid=fork();
if(pid<0){
fprintf(stderr,"Fork Failed");
return -1;
}
else if(pid>0){
FILE* fp1;
close(fd[READ_END]);
if((fp1=fopen(input,"r"))==NULL){
printf("OPEN ERROR");
return 1;
}
while(fgets(temp,1000,fp1)!=NULL){//1000可以调整
strcat(write_msg,temp);
}
write(fd[WRITE_END],write_msg,strlen(write_msg)+1);
close(fd[WRITE_END]);
fclose(fp1);
}
else{
FILE* fp2;
if((fp2=fopen(copy,"w"))==NULL){
printf("OPEN ERROR");
return 1;
}
close(fd[WRITE_END]);
read(fd[READ_END],read_msg,BUFFER_SIZE);
fputs(read_msg,fp2);
close(fd[READ_END]);
fclose(fp2);
}
return 0;
}
上一篇: 操作系统页面置换算法(opt,lru,fifo,clock)实现
下一篇: 读者-写者问题