Linux下,使用C/C++编写的一个简单的信号处理例程


// main.c file

#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

// linux header file
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>

//
void MySignalAction(int nSIG)
{
 // 信号处理例程,其中dunno将会得到信号的值 SIGUSR1
 switch(nSIG)
 {
 case SIGUSR1:
  cout<<"Receiveed SIGUSR1 signal!/n"<<nSIG <<endl;
  break;

 case SIGUSR2:
  cout<<"Receiveed SIGUSR2 signal.../n" <<nSIG <<endl;
  break;

 case SIGINT:
  cout<<"Receiveed SIGINT signal.../n" <<nSIG <<endl;
  break;

 case SIGQUIT:
  cout<<"Receiveed SIGUP signal.../n" <<nSIG <<endl;
  break;

 default:
  cout<<"Receiveed unknown a signal !/n Signal ID: " <<nSIG
   <<endl ;
 }
 cout<< "Leave MySignalAction Function!/n";
}

int main()
{
 pid_t nPID = 0;
 nPID = getpid();
 cout <<"/n------------------------------------/n";
 cout <<"The process id is : " <<nPID
   <<endl <<endl;

 cout <<"------------------------------------/n";

 // test signal
 // 下面设置三个信号的处理方法
 signal(SIGUSR1, MySignalAction);
 signal(SIGUSR2, MySignalAction);
 signal(SIGINT, MySignalAction);
 signal(SIGQUIT, MySignalAction);

 for(bool bShow = true ; ; )
 {
  if(bShow)
  {
   cout<< "进入For loop。/n";
   bShow = false;
  }
  // 挂起进程
  pause();
 }
 cout<< "Process exit!/n";
 return 0;
}

// -----------------------------------------------------------------------------------

#Makefile
#

obj = main  main.o

main: main.o
 g++ -o main  main.o


main.o: main.c
 g++ -c   main.c


.PHONY: clean
clean:
 -rm $(obj)

#end file

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: v4l2是linux内核提供的一个视频4层协议框架,它允许用户空间应用程序直接访问和控制视频设备。 在使用v4l2采集视频的例程中,首先需要打开视频设备,这可以通过打开设备文件来实现。接下来,需要通过ioctl系统调用函数来设置视频设备的参数,比如视频格式、帧率、分辨率等。可以使用VIDIOC_S_FMT命令来设置图像格式,VIDIOC_S_PARM命令来设置帧率,VIDIOC_S_CROP命令来设置裁剪窗口等。 设置完相应参数后,就可以利用mmap系统调用将视频设备内存映射到用户空间,这样应用程序就可以直接读取和写入视频数据了。读取视频数据可以使用read系统调用或者mmap到用户空间的内存进行操作。写入视频数据则可以使用write系统调用或者通过mmap到用户空间的内存进行写入。 在采集过程中,可以通过ioctl系统调用的VIDIOC_QBUF命令将缓冲区放入视频设备的队列中,并通过VIDIOC_DQBUF命令从队列中取出已经采集到的数据。通过VIDIOC_DQBUF命令可以获取到采集到的数据的地址和长度等信息。 当不再需要采集视频时,需要关闭视频设备,这可以通过关闭设备文件来实现。 总结起来,Linux的v4l2采集例程通常包括打开视频设备、设置视频参数、内存映射视频设备、采集视频数据、关闭视频设备等步骤。通过这些步骤,我们可以实现对视频设备的采集操作,获取到视频数据用于后续处理。 ### 回答2: v4l2是Linux内核中的一个视频设备驱动层,用于处理和控制视频设备的采集、输出和处理等功能。在使用v4l2采集视频的过程中,需要编写相应的采集例程。 首先,我们需要通过v4l2 API来初始化和打开视频设备。可以使用`open()`函数打开设备文件,并使用`VIDIOC_QUERYCAP`命令查询设备的能力。然后,我们需要使用`VIDIOC_S_FMT`命令来设置视频的格式。这些设置包括视频的宽度、高度、像素格式和帧率等。 接下来,我们可以使用`VIDIOC_REQBUFS`命令来请求分配视频缓冲区。这些缓冲区将被用于存储采集到的视频数据。使用`VIDIOC_QUERYBUF`命令可以查询每个缓冲区的大小和位置等信息,并使用`mmap()`函数将其映射到用户空间。 然后,我们可以使用`VIDIOC_STREAMON`命令开始视频的采集。这将启动视频设备并开始发送视频数据。我们可以使用`select()`或`poll()`函数等方法来异步获取到达的视频数据。 当有视频数据到达时,我们可以使用`VIDIOC_DQBUF`命令来获取当前缓冲区中的视频帧。然后,我们可以在用户空间对视频数据进行处理,如图像处理或编码等。 处理完视频数据后,可以使用`VIDIOC_QBUF`命令将缓冲区重新放回队列,以供下次采集新的视频数据时使用。 最后,我们可以使用`VIDIOC_STREAMOFF`命令停止视频的采集,并使用`munmap()`函数释放视频缓冲区的内存映射。最后,可以使用`close()`函数关闭视频设备文件。 以上就是基本的v4l2视频采集例程。通过这个例程,我们可以实现对视频设备的初始化、采集、处理和释放等功能。当然,实际应用中可能还需要根据具体需求进行更多的参数设置和处理操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值