1. 要求用父子进程拷贝一张图片,其中子进程先拷贝后半部分,父进程后拷贝前半部分。要求用文件IO实现。
可以使用sleep()函数 wait
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/wait.h>
int main(int argc, const char *argv[])
{
// 要求用父子进程拷贝一张图片,其中子进程先拷贝后半部分,父进程后拷贝前半部分
// 要求用文件IO实现。
// 本人只能使用wait函数
//以读的方式打开源文件
int fd_r=open("./1.jpg",O_RDONLY);
//修改文件权限掩码
umask(0);
//以写的方式打开目标文件
int fd_w=open("./copy.jpg",O_WRONLY |O_CREAT |O_TRUNC,0664);
//计算文件的大小:
off_t size =lseek(fd_r,0,SEEK_END);
printf("size =%ld\n",size);
pid_t pid = fork();
if( pid >0 )
{
//方法一:
pid_t pd=wait(NULL);
if(pd <0)
{
perror("wait");
return -1;
}
//方法二:
//sleep(3);
//拷贝前半部分
if( fd_r <0 )
{
perror("open");
return -1;
}
//修改文件偏移量
lseek(fd_r,0,SEEK_SET);
lseek(fd_w,0,SEEK_SET);
//开始拷贝
int i=0;
char ch;
//读一次写一次;
for(i=0; i<size/2; i++)
{
ssize_t res=read(fd_r,&ch,1);
if(res<=0)
{
perror("read");
return -1;
}
ssize_t ret=write(fd_w,&ch,1);
if( res <0 )
{
perror("write");
return -2;
}
}
}
else if( pid == 0 )
{
//拷贝后面半部分
//修改文件偏移量
lseek(fd_r,size/2,SEEK_SET);
lseek(fd_w,size/2,SEEK_SET);
//读一次写一次;
int i=0;
char ch;
for(i=size/2; i<size; i++)
{
ssize_t res=read(fd_r,&ch,1);
if(res<=0)
{
perror("read");
return -1;
}
ssize_t ret=write(fd_w,&ch,1);
if( ret <0 )
{
perror("write");
return -2;
}
}
}
else
{
perror("fork");
}
//关闭文件
close(fd_r);
close(fd_w);
return 0;
}
效果图:
2. 创建孤儿进程,创建僵尸进程:
孤儿进程:父进程退出,子进程死循环
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
//创建孤儿进程
//顾名思义:就是没有父子进程的进程
//创建子进程;
pid_t pid=fork();
while(1)
{
sleep(1);
//分支结构判断
if( pid >0)
{
//父进程执行,让父进程提前退出
exit(0);
}
else if( pid == 0)
{
printf("chilren pid:%d\n",pid);
}
else if(pid <0)
{
perror("fork\n");
}
}
fcolse("pid");
return 0;
}
效果图:
僵尸进程:子进程退出,父进程死循环
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
//创建僵尸进程
//顾名思义:就是没有子进程的退出,没有回收子进程的资源
//创建子进程;
pid_t pid=fork();
while(1)
{
sleep(1);
//分支结构判断
if( pid >0)
{
printf("pid:%d\n",pid);
}
else if( pid == 0)
{
//子进程执行,让子进程提前退出
exit(0);
}
else if(pid <0)
{
perror("fork\n");
}
}
return 0;
}
效果图:
3. 要求输入目录的路径后,能够打印出指定路径下所有文件的详细信息,类似ls -l
int main(int argc, const char *argv[])
{
//打开目录
if( argc != 2)
{
printf("error,请输入文件名:");
printf("\n");
return -1;
}
DIR * fp_r =opendir(argv[1]);
if( NULL == fp_r)
{
perror("opendir");
return -1;
}
//printf("opendir success\n");
struct stat p;
//printf("%s\n",argv[1]);
/*
char arr[128]="";
strcpy(arr,argv[1]);
printf("%s\n",arr);
*/
//读取目录
while(1)
{
struct dirent *fd=readdir(fp_r);
if(NULL == fd)
{
if(0 == error)
{
printf("目录读取完毕\n");
break;
}
else
{
//perror("readdir");
return -1;
}
}
if('.' == fd->d_name[0])
{
continue;
}
char arr[128]="";
strcpy(arr,argv[1]);
strcat(arr,fd->d_name);
//printf("%s ",fd->d_name);
//printf("\n");
FILE * fp=fopen("argv[1]","r");
if (stat(arr,&p)<0)
{
perror("stat");
return -1;
}
//获取文件的权限
get_filetype(p.st_mode);//获取文件类型
get_permission(p.st_mode);//获取文件的权限
//获取文件的硬链接数
printf(" %ld",p.st_nlink);
//获取文件的用户id
//printf(" %d",p.st_uid);
get_fileuid_number(p.st_uid);
//获取文件的组id
//printf(" %d",p.st_gid);
//struct group* pg= getgrgid(p.st_uid);
get_filegid_number(p.st_gid);
//获取文件的大小
printf(" %ld",p.st_size);
//获取文件的创建时间
struct tm * info;
info=localtime(&p.st_mtime);
/*
time_t t;
t=time(&t);
struct tm * info;
info=localtime(&t);
*/
printf("%2d月 %2d %02d:%02d",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min);
//获取文件名
printf(" %s\n", fd->d_name);
}
//关闭目录
closedir(fp_r);
return 0;
}