VxWorks系统中的signal使用?

panyf_2k 2002-01-25 07:14:27
我有如下程序:
#include <vxWorks.h>
#include <sigLib.h>
#include <taskLib.h>
#include <stdio.h>

void catchSIGINT(int);
void sigCatcher(void);

#define NO_OPTIONS 0
#define ITER1 100
#define LONG_TIME 1000000
#define HIGHPRIORITY 100
#define LOWPRIORITY 101
int ownId;


void sigGenerator(void)
{
int i,j,taskId;
STATUS taskAlive;

if((taskId=taskSpawn("signal",100,0x100,20000,(FUNCPTR)
sigCatcher,0,0,0,0,0,0,0,0,0,0))==ERROR)
printf("taskSpawn sigCatcher failed\n");

ownId=taskIdSelf();

taskDelay(30);

for(i=0;i<ITER1;i++)
{
if((taskAlive=taskIdVerify(taskId))==OK)
{
printf("+++++++++++++++++++++++SIGINT signal
generated\n");

kill(taskId,SIGINT);
taskPrioritySet(ownId,LOWPRIORITY);
}
else
break;
}
printf("\n******************sigGeneratro
Exited***************\n");
}

void sigCatcher(void)
{
struct sigaction newAction;
int i,j;

newAction.sa_handler=catchSIGINT;
sigemptyset(&newAction.sa_mask);
newAction.sa_flags=NO_OPTIONS;

if(sigaction(SIGINT,&newAction,NULL)==-1)
printf("Could not install signal handler\n");

for(i=0;i<ITER1;i++)
{
for(j=0;j<LONG_TIME;j++);
printf("Normal processing in sigCatcher\n");
}
printf("\n+++++++++++++++++++++++++sigCatcher
Exited++++++++++++++++++\n");
}

void catchSIGINT(int signal)
{
printf("-----------------SIGINT signal caught\n");
taskPrioritySet(ownId,HIGHPRIORITY);
}
请问一个问题:
怎么在运行结果中没有"-------------------SIGINT signal caught"
也就是void catchSIGINT()函数好像没有调用,是这样吗?
望请高手指点!谢谢!
...全文
264 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
panyf_2k 2002-03-01
  • 打赏
  • 举报
回复
难道有关信号和中断的例子就只能到目标机上进行运行?
panyf_2k 2002-03-01
  • 打赏
  • 举报
回复
我只是在单机上模拟.
我所提到的posix和bsd有关系吗?
wenyong 2002-03-01
  • 打赏
  • 举报
回复
你是在目标机上运行吗?还是在模拟器上?
我在目标机上运行时可以打出结果。
panyf_2k 2002-02-26
  • 打赏
  • 举报
回复
wenyong在吗?
帮我看一下!
panyf_2k 2002-02-21
  • 打赏
  • 举报
回复
我按照你所述运行程序,还是没有打印---------SIGNT signal caught
我看到signal有POSIX和BSD环境之分.
我的开发环境是基于win2000下的vxworks开发
不知有这方面的原因?
wenyong 2002-02-08
  • 打赏
  • 举报
回复
#include <vxWorks.h>
#include <sigLib.h>
#include <taskLib.h>
#include <stdio.h>

void catchSIGINT(int);
void sigCatcher(void);

#define NO_OPTIONS 0
#define ITER1 100
#define LONG_TIME 1000000
#define HIGHPRIORITY 100
#define LOWPRIORITY 101
int ownId;


void sigGenerator(void)
{
int i,j,taskId;
STATUS taskAlive;

printf("\n******************sigGenerator Started***************\n");

if( sigInit() == ERROR)
{
printf("signal init error\r\n");
}
if((taskId=taskSpawn("signal",100,0x100,20000,(FUNCPTR)
sigCatcher,0,0,0,0,0,0,0,0,0,0))==ERROR)
printf("taskSpawn sigCatcher failed\n");

ownId=taskIdSelf();

taskDelay(30);

for(i=0;i<ITER1;i++)
{
if((taskAlive=taskIdVerify(taskId))==OK)
{
printf("+++++++++++++++++++++++SIGINT signal generated\n");

kill(taskId,SIGINT);
taskPrioritySet(ownId,LOWPRIORITY);
}
else
break;
}
printf("\n******************sigGenerator Exited***************\n");
}

void sigCatcher(void)
{
struct sigaction newAction,oldAction;
int i,j;
STATUS saStatus;

printf("\n+++++++++++++++++++++++++sigCatcher Started++++++++++++++++++\n");

newAction.sa_handler=catchSIGINT;
sigemptyset(&newAction.sa_mask);
newAction.sa_flags=NO_OPTIONS;

if((saStatus = sigaction(SIGINT,&newAction,&oldAction))== ERROR)
{
printf("Could not install signal handler\n");
return ;
}
else
printf("SIGINT signal installed successfully!\r\n");

pause();

if((saStatus = sigaction(SIGINT,&oldAction,NULL))==ERROR)
printf("Count old uninstall signal handler\n");
else
printf("SIGINT signal uninstalled successfully!\r\n");

printf("\n+++++++++++++++++++++++++sigCatcher Exited++++++++++++++++++\n");
}

void catchSIGINT(int signal)
{
printf("-----------------SIGINT signal caught\n");
taskPrioritySet(ownId,HIGHPRIORITY);
}
wenyong 2002-02-07
  • 打赏
  • 举报
回复
忘了调用sigInit函数初始化VxWorks的信号机制,我已经试过了,SIGINT signal caught 打出来了
wenyong 2002-02-07
  • 打赏
  • 举报
回复
我来研究一下,等等我
turbopeng 2002-01-29
  • 打赏
  • 举报
回复
`up
panyf_2k 2002-01-26
  • 打赏
  • 举报
回复
??
Vxworks培训资料 Vxworks培训资料全文共89页,当前为第1页。 Vxworks简介 最成功的实时操作系统 1981,Windriver,嵌入式咨询公司 TCP/IP,NFS工具集 WIND内核 1995,tornado集成开发环境 收购SDS、DIAB、pSOS Vxworks培训资料全文共89页,当前为第2页。 Vxworks操作系统是一个嵌入式实时操作系统(RTOS)。 Vxworks与其它实时OS一样,基于以下两个重要机制: * 多任务环境及任务间通信 * 硬件断处理 Vxworks多任务内核完成的功能是:实时调度,任务间通信及互斥。 其它功能则作为系统库围绕在内核周围,它们可根据需要进行剪裁。 Vxworks与非实时系统的不同之处在于: Vxworks的优先抢占机制基于调度, Vxworks对外部事件的反应和处理快, Vxworks容量小并且可配置(微内核结构) VxWorks (1) Vxworks培训资料全文共89页,当前为第3页。 Vxworks提供了一套丰富的任务间通信机制,包括: 内存共享(Shared memory):简单的数据共享方法 信号量(Semaphore):用于基本的互斥及同步 消息队列(Message queues)和管道(pipe): 用于同一CPU上任务间消息的传递 套接口(Socket)和远程程序调用(RPC): 用于网络上任务间的通信 信号(Signal):用于异常处理 此外,Vxworks提供了三种共享内存的对象(shared-memory objects) 来实现运行在不同CPU上的任务间的高速同步和通信。 共享信号量(shared semaphores):有二进制,记数型两种 共享消息队列(shared message queues) 共享内存分区(shared-memory partitions):有系统类型和用户类型 VxWorks (2) Vxworks培训资料全文共89页,当前为第4页。 Tornado (1) Tornado提供了Vxworks系统开发的集成开发环境,其Tornado 源代码编辑器包括下列特性: 标准文本控制能力 C和C++ 语法元素用不同颜色 调制集成:编辑窗口跟踪代码的执行 编译集成:项目管理将编译警告和编译错误 直接和编辑窗口的相应代码对应起来。 Vxworks培训资料全文共89页,当前为第5页。 Tornado (2) Tornado集成开发环境由以下几个部分组成: Vxworks培训资料全文共89页,当前为第6页。 目标CPU:Vxworks 在其上运行 的一个单板计算机 Tornado PC主机:有一根串行线与目标机相连(初始化时主机作为终端用) Vxworks核二进制文件驻留在其盘上,核的下载及运行Tornado 工具 通过以太网口进行 Ethernet AGENT SERVER Vxworks培训资料全文共89页,当前为第7页。 Vxworks/Tornado开发方式 目标CPU: Vxworks 在其上运行 的一个单板计算机; Tornado PC主机:有一根串行线与目标机相连(初始化时主机作为终 端用),Vxworks核二进制文件驻留在其盘上,核 的下载及运行Tornado 工具通过以太网口进行。 Ethernet AGENT SERVER Vxworks培训资料全文共89页,当前为第8页。 Tornado开发环境 Vxworks培训资料全文共89页,当前为第9页。 Tonado开发环境(续) Vxworks培训资料全文共89页,当前为第10页。 Tornado开发环境(续) Vxworks培训资料全文共89页,当前为第11页。 Vxworks操作系统将一切与硬件有关的功能模块都放在BSP库。该BSP库是硬件与软件的接口,处理硬件的初始化、断处理与产生、硬件时钟与定时管理、局部和总线内存空间的映射、内存大小定义,等等。能够自行启动目标机、初始化目标机、能够与host通信以下载Vxworks核、把控制权交给Vxworks核来调用用户应用程序等功能。 板支持包(BSP) Vxworks培训资料全文共89页,当前为第12页。 Vxworks培训资料全文共89页,当前为第13页。 Tornado&VxWorks框架 Vxworks培训资料全文共89页,当前为第14页。 Vxworks 应用广泛的嵌入式实时操作系统 Vxworks培训资料全文共89页,当前为第15页。 VxWorks的整体构架 Hardware Independent Software Applications TCP/IP I/O System VxWorks libraries Wind microKernel File System Hardware

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧