要求用父子进程拷贝一张图片,其中子进程先拷贝后半部分,父进程后拷贝前半部分。要求
用文件IO实现。
#include <stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main(int argc, const char *argv[])
{
int fp=open("fp.png", O_RDONLY);
if(fp<0)
{
perror("open");
return -1;
}
int mp=open("./mp.png", O_WRONLY|O_CREAT|O_TRUNC, 0664);
if(mp<0)
{
printf("1");
perror("open");
return -1;
}
int size=lseek(fp, 0, SEEK_END);
size/=2;
close(fp);
printf("准备创建进程\n");
pid_t pid=fork();
if(pid>0)
{
int fp=open("./fp.png", O_RDONLY);
if(fp<0)
{
perror("open");
return -1;
}
int mp=open("./mp.png", O_WRONLY);
if(mp<0)
{
perror("open");
return -1;
}
lseek(fp, size, SEEK_SET);
lseek(mp, size, SEEK_SET);
char str[128]="";
while(1)
{
bzero(str, sizeof(str));
int res=read(fp, str, sizeof(str));
if(res<0)
{
perror("read");
return -1;
}
else if(res==0)
{
break;
}
write(mp, str, res);
}
close(fp);
close(mp);
}
if(pid==0)
{
int fp=open("fp.png", O_RDONLY);
if(fp<0)
{
perror("open");
return -1;
}
int mp=open("mp.png", O_WRONLY);
if(mp<0)
{
perror("open");
return -1;
}
char str[2]="";
while(size>0)
{
int res=read(fp, str, 1);
write(mp, str, res);
size--;
}
close(fp);
close(mp);
}
else
{
perror("fork");
return -1;
}
// while(1)
// {
// sleep(1);
// }
return 0;
}
孤儿进程:父进程退出,子进程死循环换
#include <stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main(int argc, const char *argv[])
{
printf("准备创建进程\n");
pid_t pid=fork();
if(pid>0)
{
printf("我是父进程\n");
printf("我将睡眠五秒\n");
sleep(3);
printf("我将退出\n");
}
else if(pid==0)
{
printf("我是子进程\n");
printf("pid=%d\tppid=%d", getpid(),getppid());
printf("我将睡眠五秒\n");
sleep(5);
printf("我是子进程\n");
printf("pid=%d\tppid=%d", getpid(),getppid());
}
else
{
perror("fork");
return -1;
}
return 0;
}
僵尸进程:子进程退出,父进程死循环
#include <stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
printf("准备创建进程\n");
pid_t pid=fork();
if(pid>0)
{
printf("我是父进程\n");
printf("我将睡眠一秒\n");
sleep(1);
system("ps -opid,ppid,state,tty,command");
}
if(pid==0)
{
printf("我是子进程\n");
printf("我将退出\n");
return -1;
}
else
{
perror("fork");
return -1;
}
return 0;
}
要求输入目录的路径后,能够打印出指定路径下所有文件的详细信息,类似ls -l
#include <stdio.h>
#include <sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<time.h>
#include<pwd.h>
#include<grp.h>
#include<dirent.h>
#include<errno.h>
void getfileqx(mode_t mode)
{
int i;
for(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 time_rili(time_t time)
{
struct tm *fp;
fp=localtime(&time);
if(NULL==fp)
{
perror("localtime");
return;
}
printf(" %2d月 %2d %2d:%2d:%2d ",fp->tm_mon+1,fp->tm_mday, fp->tm_hour, fp->tm_min, fp->tm_sec);
return;
}
void filequxian(mode_t m)
{
if(S_ISREG(m))
putchar('-');
else if(S_ISDIR(m))
putchar('d');
else if(S_ISCHR(m))
putchar('c');
else if(S_ISBLK(m))
putchar('b');
else if(S_ISFIFO(m))
putchar('p');
else if(S_ISLNK(m))
putchar('l');
else if(S_ISSOCK(m))
putchar('s');
return;
}
void yonghuming(uid_t m)
{
struct passwd *fp=getpwuid(m);
if(NULL==fp)
{
perror("getpwuid");
return;
}
printf("%s", fp->pw_name);
}
void zuming(gid_t m)
{
struct group* fp=getgrgid(m);
if(NULL==fp)
{
perror("getgrgid");
return;
}
printf("%s", fp->gr_name);
}
int main(int argc, const char *argv[])
{
char str[10]="";
scanf("%s",str);
DIR *fp=opendir(str);
if(NULL==fp)
{
perror("opendir");
return -1;
}
while(1)
{
struct dirent *rp;
rp=readdir(fp);
if(NULL==rp)
{
if(errno==0)
{
printf("读取完毕\n");
break;
}
else
{
printf("读取失败\n");
return -1;
}
}
// printf("%s", rp->d_name);
struct stat buf;
int p=stat(rp->d_name, &buf);
if(p<0)
{
perror("stat");
return -1;
}
//打印文件权限
filequxian(buf.st_mode);
getfileqx(buf.st_mode);
printf(" %ld", buf.st_nlink);
// printf(" %d", buf.st_uid);
yonghuming(buf.st_uid);
// printf(" %d", buf.st_gid);
zuming(buf.st_gid);
printf(" %ld", buf.st_size);
// printf(" 9月");
time_rili(buf.st_ctime);
printf("%s\n", rp->d_name);
}
closedir(fp);
// printf("time=%ld\n", buf.st_ctime);
return 0;
}