实现功能
创建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;
}