多进程编程

来源:互联网 发布:西门子编程软件step7 编辑:程序博客网 时间:2024/06/07 02:15

刚学完多进程,然后就试着写一个与多进程有关的小程序,主要就是实现多进程编程,然后就是对于代码实现的功能为日历的显示,日期的显示,文件复制,排序,判断闰年的功能。

源码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>


void choose();
void getData();
void getTime();
void getYear();
void cpyFile();
void sortNum();
void findWay();
int cmp(const void *a,const void *b);


int main(int argc,char **argv)
{
pid_t pid;
pid = fork();
switch(pid)
{
case 0: choose();
break;
case -1: perror("创建进程失败!\n");
break;
default: //wait();
break;
}
wait();
//exit(0);
return 0;
}


void choose()
{
int num;
printf("\t\t<1>日历信息显示\n");
printf("\t\t<2>日期信息显示\n");
printf("\t\t<3>判断闰年服务\n");
printf("\t\t<4>文件复制功能\n");
printf("\t\t<5>数字排序功能\n");
printf("\t\t<0>退出\n");
printf("\t\t请选择序号:");
scanf("%d",&num);
switch(num)
{
case 1:  getData();
break;
case 2: getTime();
break;
case 3: getYear();
break;
case 4: cpyFile();
break;
case 5: sortNum();
break;
case 0: exit(0);
break;
default: choose();
break;

}

}


void getData()
{
int y,m;
int c;
char DATA[20];
pid_t getD;
getD = fork();
if(-1 == getD)
{
perror("fork error!\n");
exit(-1);
}
else if(0 == getD)
{
printf("\t\t日历浏览形式\n");
printf("\t\t*1*查询某年日历\n");
printf("\t\t*2*查询自定义年,月日历\n");
printf("\t\t*3*查询当前月份日历\n");
printf("请输入你要查询日历的方式:");
scanf("%d",&c);
switch(c)
{
case 1: 
printf("请输入你要查询的年:");
scanf("%d",&y);
sprintf(DATA,"cal %d",y);
break;

case 2: 
printf("请输入你要查询的年:");
scanf("%d",&y);
printf("请输入你要查询的月:");
scanf("%d",&m);
sprintf(DATA,"cal %d %d",m,y);
break;

case 3: 
sprintf(DATA,"cal");
break;

default: printf("输入的序号有误!\n");
break;
}

system(DATA);
wait();
choose();
}
}


void getTime()
{
time_t timep;
struct tm *p;
pid_t getT;
if(-1 == (getT = fork()))
{
perror("fork error!\n");
exit(-1);
}
else if(0 == getT)
{
time(&timep);
p = gmtime(&timep);
printf("Year:%d Month: %d Day: %d\n",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday);
printf("WeekDay: %d %d:%d:%d\n",p->tm_wday,p->tm_hour,p->tm_min,p->tm_sec);
printf("Time : %s\n",asctime(p));

wait();
choose();
}

}


void getYear()
{
time_t timep;
struct tm *p;
int year;
int Ya;
pid_t getY;
if(-1 == (getY = fork()))
{
perror("fork error!\n");
exit(-1);
}
else if(0 == getY)
{
printf("\t\t   子选择区\n");
printf("\t\t《1》自动获取年份\n");
printf("\t\t《2》手动输入年份\n");
printf("\t\t请选择方式:");
scanf("%d",&Ya);
switch(Ya)
{
case 1: time(&timep);
p = gmtime(&timep);
year = 1900+p->tm_year;
break;

case 2: printf("请你输入检验的年份:"); 
scanf("%d",&year);
break;

default: printf("未能找到与之匹配的信息!");
break;
}

if((year%4 == 0)&&(year%100 != 0)||(year%400 == 0))
{
printf("%d 年是闰年!\n",year);
}
else
{
printf("%d 年不是闰年!\n",year);
}
wait();
choose();
}

}


void cpyFile()
{
pid_t getC;
int size,flag = 1;
char  GetF[50],GetF1[50],buffer[100];
char  Fname[20];
char  Fname1[20];
int fd,fd1;
if(-1 == (getC = fork()))
{
perror("fork error!\n");
exit(-1);
}
else if(0 == getC)
{
printf("显示当前目录下的所有文件\n");
findWay();
printf("请输入你想复制的文件名:");
scanf("%s",&Fname);
sprintf(GetF,"%s",Fname);
printf("请输入复制后的文件名:");
scanf("%s",&Fname1);
sprintf(GetF1,"%s",Fname1);
fd = open(GetF1,O_WRONLY|O_CREAT);
if(fd < 0)
{
printf("1111111111111111\n");
perror("OPEN ERROR!\n");
exit(-1);
}
fd1 = open(GetF,O_RDONLY);
if(fd1 < 0)
{
printf("222222222222222\n");
perror("OPEN ERROR!\n");
exit(-1);
}

while((size = read(fd1,buffer,100))>0)
{
write(fd,buffer,size);
flag = 0;
}
if(flag == 0)
printf("复制完成!\n");
else
printf("复制失败!\n");
close(fd);
close(fd1);
wait();
choose();
//_exit(0);
}
}


void sortNum()
{
pid_t getS;
int i,j;
int sort[10];
if(-1 == (getS = fork()))
{
perror("fork error!\n");
exit(-1);
}
else if(0 == getS)
{
for(i = 0 ;i<10;i++)
{
sort[i] = (int)(10.0*rand()/(RAND_MAX+1.0));
}
printf("排序前:\n");
for(i=0;i<10;i++)
printf("%d  ",sort[i]);
printf("\n");
qsort(sort,10,sizeof(sort[0]),cmp);
printf("排序后:\n");
for(i=0;i<10;i++)
printf("%d  ",sort[i]);
printf("\n");
choose();
}
//wait();
//_exit(0);
//choose();

}


int cmp(const void *a,const void *b)
{
return *(int *)a -*(int *)b;
}


void findWay()
{
int i =0;
DIR    *dir;      
struct    dirent    *ptr;           
dir = opendir("./");
while((ptr = readdir(dir)) != NULL)          
{
i++;
printf("%s\t\t", ptr->d_name);
if(i == 4)
{
i = 0;
printf("\n");
}       
}
printf("\n");
closedir(dir);     
}

0 0