欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

操作系统概念第九版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;	
} 
相关标签: c语言