IO3.5作业

文章详细介绍了如何使用C语言中的write和read函数实现文件夹的非递归拷贝,以及通过循环和fork创建包含100个进程的链式结构,同时提及了如何避免程序崩溃的问题。
摘要由CSDN通过智能技术生成

作业1: 1:使用write 和 read 实现 文件夹拷贝功能,不考虑递归拷贝

//copy文件夹
#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<dirent.h>
int main(int argc, const char *argv[])
{
	DIR * dir = opendir(argv[1]);
	if(dir == NULL)
	{
		perror("opendir");
		return -1;
	}
	char sys[128]="mkdir ";
	strcat(sys,argv[2]);
	system(sys);	
	struct dirent *dnt;
	while((dnt = readdir(dir))!=NULL){
		if(strcmp(".",dnt->d_name)==0||strcmp("..",dnt->d_name)==0)
		{
			continue;
		}
		char r[128] = {0};
		strcpy(r,argv[1]);
		strcat(r,"/");
		strcat(r,dnt->d_name);
		int rfp = open(r,O_RDONLY);
		if(rfp==-1){
			perror("open1");
			return -1;
		}
		char w[128] = {0};
		strcpy(w,argv[2]);
		strcat(w,"/");
		strcat(w,dnt->d_name);
		struct stat *mode;
		int stat1 = stat(r,mode);
		int wfp = open(w,O_WRONLY|O_CREAT|O_TRUNC,0664);
		char temp[1]={0};
		while(1)
		{
			int res = read(rfp,temp,sizeof(temp));
			if(res <= 0)
			{
				break;
			}
			write(wfp,temp,sizeof(temp));
		}
		close(rfp);
		close(wfp);
	}
	closedir(dir);
	return 0;
}
//copy文件
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, const char *argv[])
{
    int rfd = open("2.txt", O_RDONLY);
    if(rfd == -1) {
        perror("open");
        return -1;
    }
    int wfd = open("cpy.txt", O_WRONLY | O_CREAT | O_TRUNC,0664);   
    if(wfd == -1) {
        perror("open");
        return -1;
    }
    char buf[1024] = {0};
    int len = 0;
    while((len=read(rfd,buf,sizeof(buf)))>0) 
	{
        write(wfd, buf, len);
    }
    close(rfd);
    close(wfd);
    return 0;
}

作业2: 使用循环+fork的形式。创建一条进程链,链条上总共有100个进程 要求:程序不崩溃

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, const char *argv[])
{
	int num = 100;
	for (int i = 0; i < num; i++)
	{
		int res = fork();  
		if (res == -1) {
			perror("fork");
			return 1;
		}else if (res == 0) {
			printf("子进程 %d PID: %d PPID: %d\n", i+1, getpid(),getppid());
		}else
			break;
	}
    sleep(1);
	return 0;
}

通过ps -ef查看./a.out的进程信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值