嵌入式linux多进程编程


在主程序显示文本菜单。提供例如以下服务。要求每一个服务都通过生成子进程来提供。

服务包含:日历信息显示,日期信息显示,推断闰年服务,文件复制功能,数字排序功能。退出功能。


代码和文档(有流程图的下载地址):​​javascript:void(0)​


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



void DisplayCalen();// 1 显示日历
void DisplayDate(); // 2 显示日期
void LeapYear();// 3 推断闰年
void CopyFile();// 4 文件赋值功能
void SortNum(); // 5 对数字排序

int Start();// 開始界面
void menu(); // 菜单函数

int Start()
{
int n;
printf("-----linux多进程编程-----\n");
printf("1 日历信息的显示\n");
printf("2 日期信息的显示\n");
printf("3 推断闰年信息服务\n");
printf("4 文件的赋值功能\n");
printf("5 数字排序\n");
printf("6 退出程序\n");
printf("please input your choose(1-6) ");
scanf("%d",&n);
return n;
}

void DisplayCalen()
{
execlp( "cal", "cal", "-sy", (char *)0 );
}

// 2 显示当前的系统日期
void DisplayDate()
{
struct tm *ptr;
time_t it;
it=time(NULL);
ptr=localtime(&it);
printf("%4d年%02d月%02d日 %d:%d:%d\n",ptr->tm_year+1900,ptr->tm_mon+1,ptr->tm_mday,ptr->tm_hour,ptr->tm_min,ptr->tm_sec);
}
// 3 推断闰年
void LeapYear()
{
int m;
printf("please input your years ");
scanf("%d",&m);
if (((0==m%4)&&(0!=m%100))||(0==m%400)) {
printf("%d是闰年\n",m);
}else{
printf("%d不是闰年\n",m);
}

}
// 4 拷贝文件
void CopyFile()
{
const char* pathfile = "file1.c";
int in,out,flag;
char buffer[1024];
in = open("file2.c",O_RDONLY, S_IRUSR);
if(-1 == in)
{
printf("open file file2.c error!\n");
return;
}
out = creat(pathfile,S_IWUSR);
if (-1 == out)
{
printf("create file %s error!\n",pathfile);
return;
}
while((flag = read(in,buffer,1024))>0)
{
write(out,buffer,flag);
}
close(in);
close(out);
printf("copy file file2.c to %s\n",pathfile);
}
// 5 对数字排序
void SortNum()
{
int b[10]={29,59,8,9,16,7,2,98,29,10};

int i,j,t,k;
printf("数组中的10个数字为:\n");
for (i = 0; i < 10; i ++) {
printf("%d\t",b[i]);
}
printf("\n");
for(i=0;i<10-1;i++)
for(k=i,j=i+1;j<10;j++)
{
if(b[k]<b[j])
{
k=j;
}
if(i!=k)
{
t=b[i];
b[i]=b[k];
b[k]=t;
}
}
printf("从大到小的顺序为;\n");
for(i=0;i<10;i++)
printf("%d\t",b[i]);
printf("\n");
}
void menu()
{

int choose ,k=1;
pid_t child;
while(1)
{
choose=Start();
switch (choose) {
case 1:
if ((child=fork())==-1) {
printf("error......\n");
}else if (child==0)
{
DisplayCalen();
}else if( child > 0 )
{
waitpid( child, NULL, 0) ;
}
break;
case 2:
if ((child=fork())==-1) {
printf("error......\n");
}else if (child==0)
{
DisplayDate();
}else if( child > 0 )
{
waitpid( child, NULL, 0) ;
}
break;
case 3:
if ((child=fork())==-1) {
printf("error......\n");
}else if (child==0)
{
LeapYear();
}else if( child > 0 )
{
waitpid( child, NULL, 0) ;
}
break;
case 4:
if ((child=fork())==-1) {
printf("error......\n");
}else if (child>0)
{
CopyFile();
}else if( child == 0 )
{
waitpid( child, NULL, 0) ;
}
break;
case 5:
if ((child=fork())==-1) {
printf("error......\n");
}else if (child==0)
{
SortNum();
}else if( child > 0 )
{
waitpid( child, NULL, 0) ;
}
break;
case 6:
system("exit");
break;
default:
break;

}

}
}

int main()
{
menu();
return 0;
}