Linux下C语言编程基础知识(6)

2019-02-15 12:02

#i nclude

int pause(void);

int sigsuspend(const sigset_t *sigmask);

pause函数很简单,就是挂起进程直到一个信号发生了.而sigsuspend也是挂起进程只是在

调用的时候用sigmask取代当前的信号阻塞集合.

#i nclude

int sigsetjmp(sigjmp_buf env,int val);

void siglongjmp(sigjmp_buf env,int val);

还记得goto函数或者是setjmp和longjmp函数吗.这两个信号跳转函数也可以实现程序的

跳转让我们可以从函数之中跳转到我们需要的地方.

由于上面几个函数,我们很少遇到,所以只是说明了一下,详细情况请查看联机帮助.

4。一个实例

还记得我们在守护进程创建的哪个程序吗?守护进程在这里我们把那个

程序加强一下. 下面这个程序会在也可以检查用户的邮件.不过提供了一个开关,如果用 户不想程序提示有新的邮件到来,可以向程序发送SIGUSR2信号,如果想程序提供提示可以

发送SIGUSR1信号.

#i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude

/* Linux 的默任个人的邮箱地址是 /var/spool/mail/ */ #define MAIL_DIR \ /* 睡眠10秒钟 */ #define SLEEP_TIME 10 #define MAX_FILENAME 255

unsigned char notifyflag=1;

long get_file_size(const char *filename) {

struct stat buf;

if(stat(filename,&;buf)==-1) {

if(errno==ENOENT)return 0; else return -1; }

return (long)buf.st_size; }

void send_mail_notify(void) {

fprintf(stderr,\ }

void turn_on_notify(int signo) {

notifyflag=1; }

void turn_off_notify(int signo) {

notifyflag=0; }

int check_mail(const char *filename) {

long old_mail_size,new_mail_size; sigset_t blockset,emptyset; sigemptyset(&;blockset); sigemptyset(&;emptyset);

sigaddset(&;blockset,SIGUSR1); sigaddset(&;blockset,SIGUSR2);

old_mail_size=get_file_size(filename); if(old_mail_size0) send_mail_notify(); sleep(SLEEP_TIME); while(1) {

if(sigprocmask(SIG_BLOCK,&;blockset,NULL)old_mail_size)send_mail_notify; old_mail_size=new_mail_size; sleep(SLEEP_TIME); }

}

int main(void) {

char mailfile[MAX_FILENAME]; struct sigaction newact; struct passwd *pw;

if((pw=getpwuid(getuid()))==NULL) {

fprintf(stderr,\ exit(1); }

strcpy(mailfile,MAIL_DIR);

strcat(mailfile,pw->pw_name); newact.sa_handler=turn_on_notify; newact.sa_flags=0;

sigemptyset(&;newact.sa_mask);

sigaddset(&;newact.sa_mask,SIGUSR1); sigaddset(&;newact.sa_mask,SIGUSR2); if(sigaction(SIGUSR1,&;newact,NULL)


Linux下C语言编程基础知识(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:耐纳特橡胶板性能分类

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: