文件属性练习以及进程练习

一、在终端打印文件属性

  1. 从终端获取一个文件的路径以及名字
  2. 若该文件是目录文件,则将该文件下的所有文件的属性打印到终端
  3. 若该文件不是目录文件,则打印该文件的属性到终端
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

void get_fileType(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');
}

void get_filePermission(mode_t m)
{
	long x = 0400;
	char c[]="rwx";
	int count = 0; 
	while(x)
	{
		if((m & x) == 0)
			putchar('-');
		else
			printf("%c",c[count%3]);
		count++;
		x = x >> 1;
	}
	putchar(' ');
}

int getstat(char *str)
{
	struct stat buf;
	if(stat(str,&buf) < 0)
	{
		perror("stat");
		return -1;
	}
	//获取文件类型和权限
	get_fileType(buf.st_mode);
	get_filePermission(buf.st_mode);

	//获取文件的硬链接数
	printf("%ld ",buf.st_nlink);

	//获取文件所属用户
	struct passwd *uid = getpwuid(buf.st_uid);
	printf("%s ",uid->pw_name);

	//获取文件所属组用户
	struct group *gid = getgrgid(buf.st_gid);
	printf("%s ",gid->gr_name);

	//获取文件大小
	printf("%ld ",buf.st_size);

	//获取时间戳
	struct tm *info=NULL;
	info = localtime(&buf.st_mtime);
	printf("%02d %02d %02d:%02d ",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min);
	printf("%s\n",str);
}

int main(int argc, const char *argv[])
{
	char str[20]="";
	char path[300]="";
	printf("please enter a filename:");
	scanf("%s",str);

	struct stat buf;
	if(stat(str,&buf) < 0)
	{
		perror("stat");
		return -1;
	}

	if((buf.st_mode & S_IFMT) == S_IFDIR)
	{
		DIR * dp = opendir(str);
		if(NULL == dp)
		{
			perror("openrid");
			return -1;
		}
		printf("open success \n");

		struct dirent *rp = NULL;
		int i=0;
		while(1)
		{
			rp = readdir(dp);
			if(NULL == rp)
			{
				if(0 == errno)
				{
					printf("读取完毕\n");break;
				}
				else
				{
					perror("readdir");
					return -1;
				}
			}
			if(*(rp->d_name) != '.')
			{
				sprintf(path,"%s%s",str,rp->d_name);
				getstat(path);
			}
		}
		closedir(dp);
	}
	else
		getstat(str);

	return 0;
}

 二、文件IO函数实现,拷贝文件,子进程先拷贝后半部分,父进程再拷贝前半部分,允许使用sleep函数

#include 
#include 
#include 
#include 
#include 
int main(int argc, const char *argv[])
{
	int fd = open("1.txt",O_RDONLY);
	char str[128]="";
	if(fd < 0)
	{
		perror("open");
		return -1;
	}
	int fd_w = open("2.txt",O_WRONLY|O_CREAT|O_TRUNC,0664);
	if(fd_w < 0)
	{
		perror("open");
		return -1;
	}

	//计算文件大小
	off_t size = lseek(fd,0,SEEK_END);
	pid_t cpid = fork();
	if(cpid > 0)
	{
		sleep(1);
		lseek(fd,0,SEEK_SET);
		lseek(fd_w,0,SEEK_SET);
		char c;
		for(int i=0;i

你可能感兴趣的:(IO进程线程练习,进程,linux)