华清远见上海中心22071班

要求用父子进程拷贝一张图片,其中子进程先拷贝后半部分,父进程后拷贝前半部分。要求
用文件IO实现。

#include <stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>

int main(int argc, const char *argv[])
{
	int fp=open("fp.png", O_RDONLY);
	if(fp<0)
	{
		perror("open");
		return -1;
	}

	int mp=open("./mp.png", O_WRONLY|O_CREAT|O_TRUNC, 0664);
	if(mp<0)
	{
		printf("1");
		perror("open");
		return -1;
	}
	int size=lseek(fp, 0, SEEK_END);
	size/=2;
	close(fp);
	
	printf("准备创建进程\n");

	pid_t pid=fork();
	if(pid>0)
	{
		int fp=open("./fp.png", O_RDONLY);
		if(fp<0)
		{
			perror("open");
			return -1;
		}
		int mp=open("./mp.png", O_WRONLY);
		if(mp<0)
		{
			perror("open");
			return -1;
		}
		lseek(fp, size, SEEK_SET);
		lseek(mp, size, SEEK_SET);
		char str[128]="";
		while(1)
		{
			bzero(str, sizeof(str));
	     	int res=read(fp, str, sizeof(str));
			if(res<0)
			{
				perror("read");
				return -1;
			}
			else if(res==0)
			{
				break;
			}
	    	write(mp, str, res);
		}

		close(fp);
		close(mp);

	}
	if(pid==0)
	{
		int fp=open("fp.png", O_RDONLY);
		if(fp<0)
		{
			perror("open");
			return -1;
		}
		int mp=open("mp.png", O_WRONLY);
		if(mp<0)
		{
			perror("open");
			return -1;
		}
		char str[2]="";
		while(size>0)
		{
	     	int res=read(fp, str, 1);
	    	write(mp, str, res);
			size--;
		}

		close(fp);
		close(mp);
	}
	else
	{
		perror("fork");
		return -1;
	}

//	while(1)
//	{
//		sleep(1);
//	}
	
	return 0;
}

孤儿进程:父进程退出,子进程死循环换

#include <stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main(int argc, const char *argv[])
{
	printf("准备创建进程\n");

	pid_t pid=fork();

	if(pid>0)
	{
		printf("我是父进程\n");
		printf("我将睡眠五秒\n");

		sleep(3);

		printf("我将退出\n");
	}
	else if(pid==0)
	{
		printf("我是子进程\n");
		printf("pid=%d\tppid=%d", getpid(),getppid());
		printf("我将睡眠五秒\n");

		sleep(5);
		printf("我是子进程\n");
		printf("pid=%d\tppid=%d", getpid(),getppid());
	}
	else
	{
		perror("fork");
		
		return -1;
	}

	
	return 0;
}

僵尸进程:子进程退出,父进程死循环

#include <stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>

int main(int argc, const char *argv[])
{
	printf("准备创建进程\n");
	

	pid_t pid=fork();

    if(pid>0)
	{
		printf("我是父进程\n");
		printf("我将睡眠一秒\n");

		sleep(1);
	system("ps -opid,ppid,state,tty,command");
	}

	if(pid==0)
	{
		printf("我是子进程\n");
		printf("我将退出\n");
		
		return -1;
	}
	else
	{
		perror("fork");
		return -1;
	}
	return 0;
}

要求输入目录的路径后,能够打印出指定路径下所有文件的详细信息,类似ls -l

#include <stdio.h>
#include <sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<time.h>
#include<pwd.h>
#include<grp.h>
#include<dirent.h>
#include<errno.h>
void getfileqx(mode_t mode)
{
	int i;
	for(i=0; i<9; i++)
	{
		if((mode&(0400>>i))==0)
		{
			putchar('-');
			continue;
		}

		switch(i%3)
		{
		case 0:
			putchar('r');
			break;
		case 1:
			putchar('w');
			break;
		case 2:
			putchar('x');
			break;

		}

	}
	return;
}
void time_rili(time_t time)
{
	struct tm *fp;
	fp=localtime(&time);
	if(NULL==fp)
	{
		perror("localtime");
		return;
	}
	printf(" %2d月  %2d %2d:%2d:%2d  ",fp->tm_mon+1,fp->tm_mday, fp->tm_hour, fp->tm_min, fp->tm_sec);

	return;

}
void filequxian(mode_t m)
{
	if(S_ISREG(m))
		putchar('-');
	else if(S_ISDIR(m))
		putchar('d');
	else if(S_ISCHR(m))
		putchar('c');
	else if(S_ISBLK(m))
		putchar('b');
	else if(S_ISFIFO(m))
		putchar('p');
	else if(S_ISLNK(m))
		putchar('l');
	else if(S_ISSOCK(m))
		putchar('s');
	return;
}
void yonghuming(uid_t m)
{
	struct passwd *fp=getpwuid(m);
	if(NULL==fp)
	{
		perror("getpwuid");
		return;
	}
	printf("%s", fp->pw_name);
}
void zuming(gid_t m)
{
	struct group* fp=getgrgid(m);
	if(NULL==fp)
	{
		perror("getgrgid");
		return;
	}
	printf("%s", fp->gr_name);
}


int main(int argc, const char *argv[])
{
	char str[10]="";
	scanf("%s",str);

	DIR *fp=opendir(str);
	if(NULL==fp)
	{
		perror("opendir");
		return -1;
	}

	while(1)
	{
	    struct dirent *rp;
		rp=readdir(fp);
		if(NULL==rp)
		{
			if(errno==0)
			{
				printf("读取完毕\n");
				break;

			}
			else
			{
				printf("读取失败\n");
				return -1;
			}
		}
	
	//	printf("%s", rp->d_name);
	
		struct stat buf;
		int p=stat(rp->d_name, &buf);
		if(p<0)
		{
			perror("stat");
			return -1;
		}
		//打印文件权限


		filequxian(buf.st_mode);
		getfileqx(buf.st_mode);


		printf(" %ld", buf.st_nlink);

		//	printf(" %d", buf.st_uid);
		yonghuming(buf.st_uid);

		//	printf(" %d", buf.st_gid);
		zuming(buf.st_gid);


		printf(" %ld", buf.st_size);
	//	printf(" 9月");

		time_rili(buf.st_ctime);
		printf("%s\n", rp->d_name);
	}
	closedir(fp);

	//	printf("time=%ld\n", buf.st_ctime);




	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值