实现功能

创建2个线程,要求一个线程获取文件大小并输出,

  • 另一个线程获取文件拥有者用户的权限并输出,
  • 文件名由主线程提供。

源代码

/************************************************** *功能:创建2个线程,要求一个线程获取文件大小并输出, * 另一个线程获取文件拥有者用户的权限并输出, * 文件名由主线程提供。 *作者:幻竹涂 *时间:2019年11月28日。 ***************************************************/

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

void* func(void* arg)
{
   
	char* str= (char*)arg;
	if(access(str,F_OK) < 0)
	{
   
		perror("access");
		return NULL;
	}
	
	int fd = open(str,O_RDONLY);
	if(fd < 0)
	{
   
		perror("open");
		return NULL;
	}
	
	off_t* size = (off_t*)malloc(sizeof(off_t));
	*size = lseek(fd,0,SEEK_END); 
	close(fd);
	pthread_exit(size);
}

void* func1(void* arg)
{
   
	char* str = (char*)arg;
	if(access(str,F_OK) < 0)
	{
   
		perror("access");
		return NULL;
	}

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

	char* ugo = (char*)malloc(sizeof(char)*25);
	//文件拥有者
	strcpy(ugo,"USR:");
	switch(buf.st_mode & S_IRWXU)
	{
   
		case S_IRUSR:	strcat(ugo,"r--");break;
		case S_IWUSR:	strcat(ugo,"-w-");break;
		case S_IXUSR:	strcat(ugo,"--x");break;
		case S_IRUSR | S_IWUSR:	
						strcat(ugo,"rw-");break;
		case S_IRUSR | S_IXUSR:	
						strcat(ugo,"r-x");break;
		case S_IXUSR | S_IWUSR:	
						strcat(ugo,"-wx");break;
		case S_IRWXU:	strcat(ugo,"rwx");break;
	}
	
	//文件组用户
	strcat(ugo," group:");
	switch(buf.st_mode & S_IRWXG)
	{
   
		case S_IRGRP:	strcat(ugo,"r--");break;
		case S_IWGRP:	strcat(ugo,"-w-");break;
		case S_IXGRP:	strcat(ugo,"--x");break;
		case S_IRGRP | S_IWGRP:	
						strcat(ugo,"rw-");break;
		case S_IRGRP | S_IXGRP:	
						strcat(ugo,"r-x");break;
		case S_IXUSR | S_IWGRP:	
						strcat(ugo,"-wx");break;
		case S_IRWXG:	strcat(ugo,"rwx");break;
	}
	//文件其他用户
	strcat(ugo," others:");
	switch(buf.st_mode & S_IRWXO)
	{
   
		case S_IROTH:	strcat(ugo,"r--");break;
		case S_IWOTH:	strcat(ugo,"-w-");break;
		case S_IXOTH:	strcat(ugo,"--x");break;
		case S_IROTH | S_IWOTH:	
						strcat(ugo,"rw-");break;
		case S_IROTH | S_IXOTH:	
						strcat(ugo,"r-x");break;
		case S_IXOTH | S_IWOTH:	
						strcat(ugo,"-wx");break;
		case S_IRWXO:	strcat(ugo,"rwx");break;
	}
	pthread_exit(ugo);
}

int main(int argc,char** argv)
{
   
	if(argc < 2)
	{
   
		printf("Usage:%s <pathfile>\n",argv[0]);
		return -1;
	}
	
	pthread_t ptid;
	//文件大小
	int err = pthread_create(&ptid,NULL,func,argv[1]);	
	if(err)
	{
   
		puts(strerror(err));
		return -1;
	}
	off_t* size;
	pthread_join(ptid,(void**)&size);
	printf("文件大小%ld\n",*size);

	//文件权限
	err = pthread_create(&ptid,NULL,func1,argv[1]);	
	if(err)
	{
   
		puts(strerror(err));
		return -1;
	}
	char* ugo;
	pthread_join(ptid,(void**)&ugo);
	printf("文件权限:%s \n",ugo);
	
	free(ugo);
	return 0;
}




实现结果