嵌入式linux多进程编程

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

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

代码和文档(有流程图的下载地址):http://download.csdn.net/download/jingjingxujiayou/7540893

#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;
}

嵌入式linux多进程编程

时间: 2024-10-18 01:14:46

嵌入式linux多进程编程的相关文章

嵌入式 Linux网络编程(二)——TCP编程模型

嵌入式 Linux网络编程(二)--TCP编程模型 一.TCP编程模型 TCP编程的一般模型如下图: TCP编程模型分为客户端和服务器端编程,两者编程流程如下: TCP服务器端编程流程: A.创建套接字: B.绑定套接字: C.设置套接字为监听模式,进入被动接受连接状态: D.接受请求,建立连接: E.读写数据: F.终止连接. TCP客户端编程流程: A.创建套接字: B.与远程服务器建立连接: C.读写数据: D.终止连接. 二.TCP迭代服务器编程模型 TCP循环服务器接受一个客户端的连接

嵌入式 Linux网络编程(三)——UDP编程模型

嵌入式 Linux网络编程(三)--UDP编程模型 UDP编程模型: UDP循环服务器模型为: socket(...); bind(...); while(1) {    recvfrom(...);    process(...);    sendto(...); } server.c代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #inc

嵌入式 Linux网络编程(一)——Socket网络编程基础

嵌入式 Linux网络编程一--Socket网络编程基础 一.Socket简介 1.网络中进程间通信 本机进程使用进程号区别不同的进程进程间通信方式有管道.信号.消息队列.共享内存.信号量等.网络中进程间的通信首先需要识别进程所在主机在网络中的唯一标识即网络层的IP地址主机上的进程可以通过传输层的协议与端口号识别. 2.Socket原理 Socket是应用层与TCP/IP协议族通信的中间软件抽象层是一种编程接口.Socket屏蔽了不同网络协议的差异支持面向连接(Transmission Cont

嵌入式 Linux系统编程(一)——文件IO

嵌入式 Linux系统编程(一)--文件IO 一.文件IO概念 linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件IO操作.不带缓存的属于直接调用系统调用(system call)的方式,高效完成文件输入输出.它以文件标识符(整型)作为文件唯一性的判断依据.这种操作不是ASCI标准的,与系统有关,移植有一定的问题.而带缓存的是在不带缓存的基础之上封装了一层,维护了一个输入输出缓冲区,使之能跨OS,成为ASCI标准,称为标准IO库.不带缓存的方式频繁进行用户态 和内核

嵌入式 Linux系统编程(二)——文件描述符控制函数fcntl

嵌入式 Linux系统编程(二)--文件描述符控制函数fcntl 由于fcntl函数实在过于灵活和复杂,本文将fcntl函数从文件IO中单独列出来,便于详细解读.函数原型如下: #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); fcntl函数用于控制操作文件描述符fd,对文件描述符的控制操作由cmd控制命令来控制,arg参数为可选参数,是否需要arg参数取决于控制命令

嵌入式 Linux系统编程(三)——标准IO库

嵌入式 Linux系统编程(三)--标准IO库 与文件IO函数相类似,标准IO库中提供的是fopen.fclose.fread.fwrite等面向流对象的IO函数,这些函数在实现时本身就要调用linux的文件IO这些系统调用. 一.标准IO库函数的缓冲机制 由于IO设备的访问速度与CPU的速度相差好几个数量级,为了协调IO设备与CPU的速度的不匹配,对于块设备,内核使用了页高速缓存,即数据会先被拷贝到操作系统内核的页缓存区中,然后才会从操作系统内核的缓存区拷贝到应用程序的地址空间. 当应用程序尝

嵌入式 Linux系统编程(四)——文件属性

嵌入式 Linux系统编程(四)--文件属性 一.文件属性概述 Linux 文件的属性主要包括:文件的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.文件属性示例如下: 多个文件属性查看: ls -lih 1341714 -rw-r--r-- 1 root root 2.5K May 28 10:24 bit_marco.c 1341718 -rw-r--r-- 1 root root 2.1K May 28 09:08 bit_marco.c~ 1341706

嵌入式 Linux系统编程(五)——目录文件函数

嵌入式 Linux系统编程(五)--目录文件函数 Linux中目录也是文件,目录操作函数为标准IO库函数.主要函数如下: #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); DIR *fdopendir(int fd); 成功返回一个指向目录流的指针,失败返回NULL,并且设置errno全局变量. #include <dirent.h> struct dirent *rea

嵌入式 Linux系统编程(六)——系统信息

嵌入式 Linux系统编程(六)--系统信息 一.时间 Linux系统下常用的时间类型:time_t.struct tm.struct timeval.struct timespec. 1.time_t类型时间 time_t实际是一个长整型.其值表示为从UTC(coordinated universal time)时间1970年1月1日00时00分00秒(也称为Linux系统的Epoch时间)到当前时刻的秒数.由于time_t类型长度的限制,它所表示的时间不能晚于2038年1月19日03时14分