1.
要求用父子进程拷贝一张图片,其中子进程先拷贝后半部分,父进程后拷贝前半部分。要求
用文件
IO
实现。
可以使用
sleep()
函数
wait
#include <stdio.h>
#include <string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<error.h>
int main(int argc, const char *argv[])
{
int fd_r = open("./2.jpg",O_RDONLY);
if(fd_r<0)
{
perror("openr");
return -1;
}
/* int fd_w = open("./21.jpg",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fd_w < 0);
{
perror("openw");
// return -1;
}*/
pid_t pid = fork();
off_t size = lseek(fd_r,0,SEEK_END);
ssize_t res=0;
if(pid>0)
{
printf("父");
int fd_w = open("./21.jpg",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fd_w < 0);
{
perror("openw");
// return -1;
}
sleep(1);
lseek(fd_r,0,SEEK_SET);
lseek(fd_w,0,SEEK_SET);
for(int i=0;i<size/2;i++)
{
char buf;
res = read(fd_r,&buf,1);
if(res<0)
{
perror("read");
return -1;
}
else if(0==res)
{
break;
}
if(write(fd_w,&buf,res)<0)
{
perror("write");
return -1;
}
}
close(fd_w);
}
else if(0==pid)
{
int fd_w = open("./22.jpg",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fd_w < 0);
{
perror("openw");
// return -1;
}
lseek(fd_r,-size/2,SEEK_END);
lseek(fd_w,-size/2,SEEK_END);
char buf;
res = read(fd_r,&buf,1);
printf("子");
for(int i=0;i<size/2;i++)
{
if(res<0)
{
perror("read");
return -1;
}
else if(0==res)
{
break;
}
if(write(fd_w,&buf,res)<0)
{
perror("write");
return -1;
}
}
close(fd_w);
}
else
{
perror("fork");
return -1;
}
printf("图片复制成功\n");
close(fd_r);
// close(fd_w);
return 0;
}
功能测试
2.
创建孤儿进程,创建僵尸进程:
孤儿进程:父进程退出,子进程死循环换
僵尸进程:子进程退出,父进程死循环。
孤儿进程:
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <unistd.h>
4 int main(int argc, const char *argv[])
5 {
6 if(fork() == 0)
7 {
8 while(1)
9 {
10 printf("child\n");
11 sleep(1);
12 }
13 }
14 return 0;
15 }
~
僵尸进程
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <unistd.h>
4
5 int main(int argc, const char *argv[])
6 {
7 //创建子进程
8
9 if (fork() > 0)
10 {
11 printf(" parent\n");
12 while (1)
13 {
14 printf("parent -------\n");
15 sleep(1);
16 }
17 }
18 else if(0 == fork())
19 {
20 printf("child\n");
21
22 }
23 else
24 {
25 perror("fork");
26 return -1;
27 }
28 return 0;
29 }
30
3.要求输入目录的路径后,能够打印出指定路径下所有文件的详细信息,类似ls -l
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<time.h>
#include<pwd.h>
#include<dirent.h>
#include<errno.h>
#include<grp.h>
char get_filetype(mode_t m)
{
switch(m & S_IFMT){
case S_IFSOCK: printf("s"); break;
case S_IFLNK: printf("l"); break;
case S_IFREG: printf("-"); break;
case S_IFBLK: printf("b"); break;
case S_IFDIR: printf("d"); break;
case S_IFCHR: printf("c"); break;
case S_IFIFO: printf("p"); break;
}
return 0;
}
void modex(mode_t mode)
{
int a=0400;
int flag=0;
while(a!=0)
{
if((mode&a)==0)
{
putchar('-');
}
else
{
switch(flag%3)
{
case 0:putchar('r');break;
case 1:putchar('w');break;
case 2:putchar('x');break;
}
}
a=a>>1;
flag++;
}
}
int main(int argc, const char *argv[])
{
DIR *dp = opendir("./");
if(NULL==dp)
{
perror("opendir");
return -1;
}
struct dirent *rp;
while(1)
{
rp = readdir(dp);
if(NULL==rp)
{
if(0==errno)
{
break;
}
else
{
perror("readdir");
return -1;
}
}
//获取文件的所有属性
struct stat buf;
if(stat(rp->d_name,&buf)<0)
{
perror("stat");
return -1;
}
//文件类型及文件权限
get_filetype(buf.st_mode);
modex(buf.st_mode);
printf(" %ld ",buf.st_nlink);
struct passwd *pwd=getpwuid(getuid());
struct group *grp = getgrgid(getgid());
printf("%s %s ",pwd->pw_name,grp->gr_name);
printf("%ld ",buf.st_size);
struct tm* info = localtime(&buf.st_ctime);
if(NULL==info)
{
perror("localtime");
return -2;
}
printf("%d月 %d %d:%d ",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min);
printf("%s\n",rp->d_name);
printf("\n");
}
return 0;
}