1.用父子进程拷贝一张图片,其中子进程先拷贝后半部分,父进程后拷贝前半部分。要求用文件IO实现。
函数:
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
int fd=open("./1.jpg",O_RDONLY);
int fd_copy=open("./2.jpg",O_WRONLY|O_CREAT|O_TRUNC,0774);
char str[100]="";
off_t length=lseek(fd,0,SEEK_END);
pid_t pid=fork();
if(pid<0)
{
perror("fork");
return -1;
}
else if(pid>0)
{
sleep(3);
lseek(fd,0,SEEK_SET);
lseek(fd_copy,0,SEEK_SET);
char arr[100]="";
ssize_t res1=0;
for(int i=0;i<length/2;i++)
{
res1=read(fd,arr,sizeof(arr));
if(res1==-1)
{
perror("resd");
return -1;
}
write(fd_copy,arr,res1);
}
printf("父进程拷贝完成\n");
}
else
{
lseek(fd,length/2,SEEK_SET);
ssize_t res2=0;
while(1)
{
res2=read(fd,str,sizeof(str));
if(res2<0)
{
perror("open");
return -1;
}
else if(0==res2)
{
break;
}
if(write(fd_copy,str,res2)<0)
{
perror("open");
return -1;
}
}
printf("子进程拷贝完成\n");
}
close(fd);
close(fd_copy);
return 0;
}
2. 创建孤儿进程,创建僵尸进程
孤儿进程:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid<0)
{
perror("fork");
return -1;
}
else if(pid>0)
{
return 1;
}
else
{
while(1)
{
sleep(1);
}
}
return 0;
}
僵尸进程:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid<0)
{
perror("fork");
return -1;
}
else if(pid==0)
{
return 1;
}
else
{
while(1)
{
sleep(1)
}
}
return 0;
}
3.要求输入目录的路径后,能够打印出指定路径下所有文件的详细信息,类似ls -l
主函数:
#include <stdio.h>
#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdlib.h>
#include <pwd.h>
#include <grp.h>
#include <unistd.h>
#include "zy2.h"
int main(int argc, const char *argv[])
{
DIR*dp=opendir("./");
if(NULL==dp)
{
perror("opendir");
return -1;
}
struct dirent*rp;
struct stat str;
while(1)
{
rp=readdir(dp);
if(stat(rp->d_name,&str)<0)
{
perror("stat");
return -1;
}
if(NULL==rp)
{
if(0==errno)
{
printf("目录读取完毕\n");
break;
}
else
{
perror("readdir");
return -1;
}
}
if((rp->d_name)[0]!='.')
{
filetype(str.st_mode);
modeshow(str.st_mode);
printf(" %ld",str.st_nlink);
usrname(str.st_uid);
grpname(str.st_gid);
printf(" %6ld",str.st_size);
timepos(str.st_mtime);
printf(" %s\n",rp->d_name);
}
}
closedir(dp);
return 0;
}
功能函数:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdlib.h>
#include <pwd.h>
#include <grp.h>
void modeshow(mode_t mode)
{
for(int i=0;i<9;i++)
{
if((mode&(0400>>i))==0)
{
putchar('-');
continue;
}
switch(i%3)
{
case 0:
putchar('r');
break;
case 1:
putchar('w');
break;
case 2:
putchar('x');
break;
}
}
return;
}
void timepos(time_t time)
{
struct tm *q=localtime(&time);
if(NULL==q)
{
perror("localtime");
return;
}
printf("%2d月 %2d %02d:%02d",q->tm_mon+1,q->tm_mday,q->tm_hour,q->tm_min);
fflush(stdout);
}
char filetype(mode_t m)
{
switch(m&S_IFMT)
{
case S_IFBLK:printf("b");break;
case S_IFCHR:printf("c");break;
case S_IFDIR:printf("d");break;
case S_IFIFO:printf("p");break;
case S_IFLNK:printf("l");break;
case S_IFREG:printf("-");break;
case S_IFSOCK:printf("s");break;
}
return 0;
}
void usrname(uid_t uid)
{
struct passwd* pwd=getpwuid(uid);
if(NULL==pwd)
{
perror("getpwuid");
return ;
}
printf(" %s",pwd->pw_name);
return;
}
void grpname(gid_t gid)
{
struct group*grp=getgrgid(gid);
if(NULL==grp)
{
perror("getgrgid");
return;
}
printf(" %s ",grp->gr_name);
}
头文件:
#ifndef _ZY_H
#define _ZY_H
void modeshow(mode_t mode);
void timepos(time_t time);
char filetype(mode_t m);
void usrname(uid_t uid);
void grpname(gid_t gid);
void timepos(time_t time);
#endif
终端输出结果: