Linux c 匿名管道实例—创建两个子进程与父进程进行管道通信
2013-08-14 19:43
507 查看
综合:
建立两个子进程:
一个负责计算1-50000的素数
另外一个负责计算50001-100000
父进程负责存储
利用fork创建两个子进程的框架:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void main()
{
int id = 1;
while(1)
{
if(fork())
{
if(id>2) //循环创建两个子进程
{
break;
}
continue;
}
else
{
//子进程
while(1)
{
//子进程处理
}
exit(0); //子进程处理完就退出,父进程处理不会影响子进程
}
}
//以下父进程处理
}
注:此创建两个子进程的框架、只是两个子进程处理相同的问题。
程序代码:
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<signal.h>
#include<stdlib.h>
#include<string.h>
#include<sched.h>
intidx=0;
intfddata;
voidhandle(int s)
{
int status;
if(s==SIGCHLD)
{
wait(&status);
idx++;
if(idx==2)
{
close(fddata);
printf("任务完成\n");
exit(-1);
}
}
}
intisprimer(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();
}
}
注:sched_yield()函数—让出cpu,让其他进程先执行。
SIGCHLD 子进程结束后系统向父进程发送的信号,告诉父进程,子进程已经结束。
建立两个子进程:
一个负责计算1-50000的素数
另外一个负责计算50001-100000
父进程负责存储
利用fork创建两个子进程的框架:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void main()
{
int id = 1;
while(1)
{
if(fork())
{
if(id>2) //循环创建两个子进程
{
break;
}
continue;
}
else
{
//子进程
while(1)
{
//子进程处理
}
exit(0); //子进程处理完就退出,父进程处理不会影响子进程
}
}
//以下父进程处理
}
注:此创建两个子进程的框架、只是两个子进程处理相同的问题。
程序代码:
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<signal.h>
#include<stdlib.h>
#include<string.h>
#include<sched.h>
intidx=0;
intfddata;
voidhandle(int s)
{
int status;
if(s==SIGCHLD)
{
wait(&status);
idx++;
if(idx==2)
{
close(fddata);
printf("任务完成\n");
exit(-1);
}
}
}
intisprimer(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();
}
}
注:sched_yield()函数—让出cpu,让其他进程先执行。
SIGCHLD 子进程结束后系统向父进程发送的信号,告诉父进程,子进程已经结束。
相关文章推荐
- 如何:使用匿名管道在本地进程之间进行通信(C#)
- C#使用匿名管道在本地进程之间进行通信
- linux进程通信之使用匿名管道进行父子进程通信
- 父进程下的两个子进程通过管道进行通信
- Python进程通信之匿名管道实例讲解
- QT单实例应用,使用QLocalSocket进行进程通信,不同运行权限下运行的同一个进程通讯失败,报错 “QLocalSocket::SocketAccessError”
- linux进程通信--有名管道(FIFO)(含实例代码)
- 进程间利用管道进行通信:打印斐波那契数列
- C++进程通信之匿名管道
- 孙鑫VC学习笔记:第十七讲 (二) 用匿名管道实现进程间的通信
- 通过命令管道,在进程之间进行通信的简单例子
- C#中使用命名管道进行进程通信的实例
- 无名管道的亲缘关系进程的通信实例
- Linux c 管道文件-进程间的通信 mkfifo、pipe
- LINUX 进程通信之匿名管道
- 使用命名管道通过网络在进程之间进行通信
- 【进程通信】popen与pclose,创建一个管道连接到另一个进程中
- 进程通信之二 管道技术第二篇 匿名管道
- 多线程编程实例----进程通信之命名管道