linux 下如何编写一个完整的应用程序!

步骤如下:

一:编写源码:本文末尾是我自己编写的一个简单的按键应用程序keyFunction.c   

二:编译源码:在linux环境下,用对应的toolchain 编译源码,生成应用程序的可执行文件 keyFunction

                          例如:# arm-none-linux-gnueabi-gcc -okeyFunction keyFunction.c

三:添加应用程序keyFunction到文件系统:

        linux系统在启动时,会自动调用并执行脚本 /etc/init.d/rc.local,因此当我们的应用需要一开机就自动运行的话,就可以直接在文件系统的rc.local 中添加指令如下:

####################     rc.local    ###############

#!/bin/sh

echo "local service: telnetd start"
telnetd
/etc/jffs2/service.sh &
/opt/./keyFunction &
#echo "Samba start"
#nmbd -D
#smbd -D

#############################################

上面红色部分就是添加的我自己的应用程序,注意:指令格式,及应用程序所在的目录一定要正确,否则应用不能运行!


如果应用程序不需要开机就运行,那就可以将keyFunction放在文件系统的任意目录中,比如 /opt/ ,   /usr/bin/ 等,然后在需要运行keyFunction的时候,由其它的应用程序通过系统调用来执行,此时不需要在rc.local 中添加任何指令。假设keyFunction /opt/目录中,那么可以用下面的方法启动keyFunction

system("/opt/./keyFunction &"); 

其中‘&’ 表示在后台运行。


结束!





###################################      keyFunction.c    ######################

#include

#include
#include
#include
#include
#include
#include /*文件控制*/
#include
#include /*时间方面的函数*/
#include /*有关错误方面的宏*/
#include //poll()
#include
#include //memset()
#include  


int main(void)
{
int fd,ret;
struct pollfd event;                                                          //创建一个struct pollfd结构体变量,存放文件描述符、要等待发生的事件
struct input_event key_value;


        while(1)
        { 
                fd=open("/dev/input/event1",O_RDWR); 
                if(fd<0)
                {
                    perror("open  error!\n");
                    exit(1);
                }
                                                                                                  //poll结束后struct pollfd结构体变量的内容被全部清零,需要再次设置
                memset(&event,0,sizeof(event));                        //memst函数对对象的内容设置为同一值
                event.fd=fd;                                                             //存放打开的文件描述符
                event.events=POLLIN;                                         //存放要等待发生的事件
                ret=poll((struct pollfd *)&event,1,5000);             //监测event,一个对象,等待5000毫秒后超时,-1为无限等待


                                                                                                //判断poll的返回值,负数是出错,0是设定的时间超时,整数表示等待的时间发生
               if(ret<0)
               {
                   printf("poll error!\n");
                   exit(1);
                }
               if(ret==0)
               {
                 //printf("Time out!\n");
                   continue;

               }


             if(event.revents&POLLERR)
             {                                                                                      //revents是由内核记录的实际发生的事件,events是进程等待的事件
                  printf("Device error!\n");
                  exit(1);
              }
            if(event.revents&POLLIN)
           {     //key_value=0;
                  ret=read(fd,&key_value,sizeof(key_value));

                 if(key_value.value==0) //此处判断按键是否松开
                 {
                       switch(key_value.code) //驱动input 上来的真正的按键值
                       {
                            case KEY_MENU:
                                      printf("press----KEY_MENU     mplayer\n");
                                      system("mount /dev/mmcblk0p1 /mnt/"); //system 是系统调用函数,可直接执行文件系统中的任何其他应用程序。

                                      system("/opt/./mplayer -n /mnt/wenbie.mp4 &");//此处调用/opt/ 下的应用程序 ./mplayer  并播放视频文件wenbie.mp4 , '&' 表示在后台运行。

                                      break;

                           case KEY_UP:
                                     printf("press----KEY_UP     preview\n");
                                     system("mount /dev/mmcblk0p1 /mnt/");
                                     system("/opt/./preview");

                                     break;


                           case KEY_DOWN:
                                     printf("press----KEY_DOWN    audiorec\n");
                                     system("mount /dev/mmcblk0p1 /mnt/");
                                     system("/opt/./audiorec -p /mnt -a 2 -t 120");

                                      break;


                           default:
                                       break;
                       }
                }

           }


         close(fd);
      }

      return 0;
}

你可能感兴趣的:(linux,基本功)