ARM的嵌入式Linux移植体验之应用实例

时间:2012-05-11来源:网络

sleep

函数调用sleep可以用来使进程挂起指定的秒数,该函数的原型为:

unsignedintsleep(unsignedintseconds);

该函数调用使得进程挂起一个指定的时间,如果指定挂起的时间到了,该调用返回0;如果该函数调用被信号所打断,则返回剩余挂起的时间数(指定的时间减去已经挂起的时间)。

exit

系统调用exit的功能是终止本进程,其函数原型为:

void_exit(intstatus);

_exit会立即终止发出调用的进程,所有属于该进程的文件描述符都关闭。参数status作为退出的状态值返回父进程,在父进程中通过系统调用wait可获得此值。

wait

wait系统调用包括:

pid_twait(int*status);

pid_twaitpid(pid_tpid,int*status,intoptions);

wait的作用为发出调用的进程只要有子进程,就睡眠到它们中的一个终止为止;waitpid等待由参数pid指定的子进程退出。

Linux的进程间通信(IPC,InterProcessCommunication)通信方法有管道、消息队列、共享内存、信号量、套接口等。套接字通信并不为Linux所专有,在所有提供了TCP/IP协议栈的操作系统中几乎都提供了socket,而所有这样操作系统,对套接字的编程方法几乎是完全一样的。管道分为有名管道和无名管道,无名管道只能用于亲属进程之间的通信,而有名管道则可用于无亲属关系的进程之间;消息队列用于运行于同一台机器上的进程间通信,与管道相似;共享内存通常由一个进程创建,其余进程对这块内存区进行读写;信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。

下面是一个使用信号量的例子,该程序创建一个特定的IPC结构的关键字和一个信号量,建立此信号量的索引,修改索引指向的信号量的值,最后清除信号量:

#include

#include

#include

#include

voidmain()

{

key_tunique_key;/*定义一个IPC关键字*/

intid;

structsembuflock_it;

unionsemunoptions;

inti;

unique_key=ftok(.,'a');/*生成关键字,字符'a'是一个随机种子*/

/*创建一个新的信号量集合*/

id=semget(unique_key,1,IPC_CREAT|IPC_EXCL|0666);

printf(semaphoreid=%dn,id);

options.val=1;/*设置变量值*/

semctl(id,0,SETVAL,options);/*设置索引0的信号量*/

/*打印出信号量的值*/

i=semctl(id,0,GETVAL,0);

printf(valueofsemaphoreatindex0is%dn,i);

/*下面重新设置信号量*/

lock_it.sem_num=0;/*设置哪个信号量*/

lock_it.sem_op=-1;/*定义操作*/

lock_it.sem_flg=IPC_NOWAIT;/*操作方式*/

if(semop(id,lock_it,1)==-1)

{

printf(cannotlocksemaphore.n);

exit(1);

}

i=semctl(id,0,GETVAL,0);

printf(valueofsemaphoreatindex0is%dn,i);

/*清除信号量*/

semctl(id,0,IPC_RMID,0);

}

3.线程控制/通信编程Linux本身只有进程的概念,而其所谓的线程本质上在内核里仍然是进程。大家知道,进程是资源分配的单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量)。Linux中所谓的线程只是在被创建的时候克隆(clone)了父进程的资源,因此,clone出来的进程表现为线程。Linux中最流行的线程机制为LinuxThreads,它实现了一种Posix1003.1cpthread标准接口。

线程之间的通信涉及同步和互斥,互斥体的用法为:

pthread_mutex_tmutex;

pthread_mutex_init(mutex,NULL);//按缺省的属性初始化互斥体变量mutex

pthread_mutex_lock(mutex);//给互斥体变量加锁

…//临界资源

phtread_mutex_unlock(mutex);//给互斥体变量解锁

同步就是线程等待某个事件的发生。只有当等待的事件发生线程才继续执行,否则线程挂起并放弃处理器。当多个线程协作时,相互作用的任务必须在一定的条件下同步。Linux下的C语言编程有多种线程同步机制,最典型的是条件变量(conditionvariable)。而在头文件semaphore.h中定义的信号量则完成了互斥体和条件变量的封装,按照多线程程序设计中访问控制机制,控制对资源的同步访问,提供程序设计人员更方便的调用接口。下面的生产者/消费者问题说明了Linux线程的控制和通信:

#include

#include

#defineBUFFER_SIZE16

structprodcons

{

intbuffer[BUFFER_SIZE];

pthread_mutex_tlock;

intreadpos,writepos;

pthread_cond_tnotempty;

pthread_cond_tnotfull;

};

/*初始化缓冲区结构*/

voidinit(structprodcons*b)

{

pthread_mutex_init(b->lock,NULL);

pthread_cond_init(b->notempty,NULL);

pthread_cond_init(b->notfull,NULL);

b->readpos=0;

b->writepos=0;

}

/*将产品放入缓冲区,这里是存入一个整数*/

voidput(structprodcons*b,intdata)

{

pthread_mutex_lock(b->lock);

/*等待缓冲区未满*/

if((b->writepos+1)%BUFFER_SIZE==b->readpos)

{

pthread_cond_wait(b->notfull,b->lock);

}

/*写数据,并移动指针*/

b->buffer[b->writepos]=data;

1 2 3 4 5

关键词: 应用 实例 体验 移植 嵌入式 Linux ARM

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版