操作系统概念第九版3.27题

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;	
} 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值