⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pending.c

📁 最新rtlinux内核源码
💻 C
字号:
/* * POSIX.1 Signals test program * * Written by J. Vidal * Copyright (C) Dec, 2002 OCERA Consortium. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2. * * Simple program to test signal delivery order and global sigactions. * */#include <rtl.h>#include <rtl_sched.h>#define NTASKS 2static pthread_t thread[NTASKS];static int sig_rec[NTASKS];#define MAXSIGNALS_REC 100static void signal_handler(int signal){  rtl_printf("Signal handler called for signal %d\n",signal);}static void *start_routine(void *arg){  struct sched_param p;  struct sigaction sa;  int err,i,signal,count=0;  rtl_sigset_t set;  int param=(unsigned) arg;      p . sched_priority =1;  pthread_setschedparam (pthread_self(), SCHED_FIFO, &p);        sa.sa_handler=signal_handler;  sa.sa_mask=0;  sa.sa_flags=0;    rtl_printf("Program actions for no valid signals. Expect failure\n");  signal=RTL_SIGUSR1-1;  if ((err=sigaction(signal,&sa,NULL))<0 ){    rtl_printf("sigaction(%d,&sa,NULL) FAILING, err:%d.\n",signal,err);  }  signal=RTL_SIGRTMAX+1;  if ((err=sigaction(signal,&sa,NULL))<0 ){    rtl_printf("sigaction(%d,&sa,NULL) FAILING, err:%d.\n",signal,err);  }    rtl_sigfillset(&set);  pthread_sigmask(SIG_BLOCK,&set,NULL);  if (!param){    rtl_printf("Thread %d programing all user signals\n",param);    for (i=RTL_SIGUSR1; i<=RTL_SIGRTMAX; i++){      rtl_sigdelset(&set,i);      if ((err=sigaction(i,&sa,NULL))<0 ){	rtl_printf("sigaction(%d,&sa,NULL) FAILING, err:%d.\n",i,err);      }    }    while (count<MAXSIGNALS_REC) {                rtl_printf("Thread %d waiting for signals\n",param);      sigsuspend(&set);      count++;      rtl_printf("Thread %d before killing\n",param);      for (i=RTL_SIGUSR1; i<=RTL_SIGRTMAX; i++){	pthread_kill(thread[(param+1)%NTASKS],i);      }    }   } else {    rtl_printf("Thread %d programing odd user signals (overwritting previous programmed)\n",param);    for (i=RTL_SIGRTMAX;i>=RTL_SIGUSR1; i-=2){      rtl_sigdelset(&set,i);      if ((err=sigaction(i,&sa,NULL))<0 ){	rtl_printf("sigaction(%d,&sa,NULL) FAILING, err:%d.\n",i,err);      }    }    while (count<MAXSIGNALS_REC) {          rtl_printf("Thread %d before killing\n",param);      for (i=RTL_SIGRTMAX;i>=RTL_SIGUSR1; i--){	pthread_kill(thread[(param+1)%NTASKS],i);      }      rtl_printf("Thread %d waiting for signals\n",param);      sigsuspend(&set);      count++;    }   }   sig_rec[param]=count;  rtl_sigfillset(&set);  //Block thread, so all user signals are blocked.  sigsuspend(&set);  return 0;  }  int init_module(void) {  int i;    // Threads creation.  for (i=0;i<NTASKS;i++)    pthread_create (&thread[i], NULL, start_routine,(void *) i);     return 0;}void cleanup_module(void) {  int i;    for (i=0;i<NTASKS;i++){      rtl_printf("\n thread %d has received %d signals\n",i, sig_rec[i]);      pthread_delete_np (thread[i]);  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -