您的位置:首页 > 运维架构 > Linux

linux高级编程day07 笔记

2012-08-22 10:13 274 查看
回顾:
1.信号的作用
2.理解信号:
软中断
可靠与不可靠信号kill -l
3.信号发送与注册kill/raise alarm setitimer signal
4.信号的屏蔽sigprocmask sigemptyset sigfillset ...
5.信号屏蔽的切换
sigpending
sigsuspend
=pause+
指定屏蔽信号
pause与sigsuspend都回被信号中断.
中断的是pause与sigsuspen,不是进程中其他代码

sigsuspend放在sigprocmask环境中思考:
5.1.sigsuspend是否影响sigprocmask屏蔽的信号呢?
影响.使原来的屏蔽信号全部失效.
当sigsuspend返回,恢复原来的屏蔽信号.
5.2.sigsuspend什么时候使用?

View Code

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <sched.h>
int idx=0;
int fddata;
void handle(int s)
{
int status;
if(s==SIGCHLD)
{
wait(&status);
idx++;
if(idx==2)
{
close(fddata);
printf("任务完成\n");
exit(-1);
}
}
}
int isprimer(int ta)
{
int i=2;
for(;i<ta;i++)
{
if(ta%i==0)
{
return 0;
}
}
return 1;
}
main()
{
int a,b;
int id=1;
int fd[2];
signal(SIGCHLD,handle);
pipe(fd);
while(1)
{
if(id==1){
a=2;b=50000;
}
if(id==2){
a=50001;b=100000;
}
if(fork()){
id++;
if(id>2){
break;
}
continue;
}
else{
//子进程
int i;
close(fd[0]);
for(i=a;i<=b;i++)
{
if(isprimer(i))
{
write(fd[1],&i,sizeof(int));
}
sched_yield();
}
printf("%d任务完成!\n",getpid());
exit(0);
}
}
int re;
char buf[20];
//打开文件,准备存储
close(fd[1]);
fddata=open("result.txt",
O_RDWR|O_CREAT,0666);
while(1)
{
read(fd[0],&re,sizeof(int));
sprintf(buf,"%d\n",re);
write(fddata,buf,strlen(buf));
sched_yield();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: