进程通信中如何进行值得传递?
2015-04-14 16:07
429 查看
子进程中修改了程序的某个全局变量的值,如何在其他子进程中或者父进程中取得修改后的值,除了连数据库之外,还可以通过共享内存来获取。
举例说明:
#include <sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include <sys/shm.h>
int main()
{
pid_t pid; //记录fork()的返回值,用于区别父子进程
char *Message; //用于记录输出信息
int LoopVal; //用于记录父子进程的循环次数
int LoopVal1; //用于循环
int ExitCode;
int P1 = 100; //定义一个全局变量的初值。后面子进程中修改这个变量的值。
printf("the new fork starting\n");
pid=fork(); //新建子进程
switch(pid)
{
case -1: //建立进程错误
printf("creat new fork error!");
exit(1);
case 0: //子进程
Message = "This is in the child process";
printf("childid=%d\n",getpid());
LoopVal = 7;
ExitCode = 24;
key_t key = ftok(".",100);
if(key ==-1)
{
printf("出错了\n");
return -1;
}
int id = shmget(key,4,IPC_CREAT|IPC_EXCL|0666);
printf("id = %d\n",id);
void *p = shmat (id,0,0);
int *pi = p;
*pi = P1+1 ;//子进程中对全局变量进行加1操作。父进程后续去取这个修改后的值。
shmdt(p);
exit(0);
default: //父进程
Message = "This is in the parent process,waiting the child finished........\n";
printf("pareentid=%d\n",getpid());
LoopVal = 5;
ExitCode = 15;
key_t key1 = ftok(".",100); //父进程指向子进程共享的那块内存。
int shmid1 = shmget(key1,0,0);
printf("shmid = %d\n",shmid1);
void *p1 = shmat(shmid1, 0, 0);//获取到子进程中修改后的全局变量的地址。
int *pi1 = p1;
printf("*pi1=%d\n",*pi1);//打印子进程中修改后的值。
shmdt(p1);
break;
}
printf("LoopVal=%d\n",LoopVal);
for(LoopVal1=0;LoopVal1<LoopVal;LoopVal1++)
{
puts(Message);
sleep(1);
}
if(pid!=0) //父进程
{
int StateVal;
pid_t ChildPid;
ChildPid = wait(&StateVal); //用StateVal记录状态信息
//
printf("The child has finished with the PID of %d\n",ChildPid);
if(WIFEXITED(StateVal)) //如果子进程正常结束,它就取一个非零值
{ //说明:WEXITSTATUS刚好和WIFEXITED相反,当子进程正常结束,它就取一个零值,非正常结束,取一个非零值。
printf("the child processxx has exit with code %d\n",WEXITSTATUS(StateVal));
} //如果WIFEXITED非零,它返回子进程的退出码
else
printf("the child has terminated abnormally\n");
}
printf("end--") ; //子进程非正常结束
//exit(ExitCode);
}
举例说明:
#include <sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include <sys/shm.h>
int main()
{
pid_t pid; //记录fork()的返回值,用于区别父子进程
char *Message; //用于记录输出信息
int LoopVal; //用于记录父子进程的循环次数
int LoopVal1; //用于循环
int ExitCode;
int P1 = 100; //定义一个全局变量的初值。后面子进程中修改这个变量的值。
printf("the new fork starting\n");
pid=fork(); //新建子进程
switch(pid)
{
case -1: //建立进程错误
printf("creat new fork error!");
exit(1);
case 0: //子进程
Message = "This is in the child process";
printf("childid=%d\n",getpid());
LoopVal = 7;
ExitCode = 24;
key_t key = ftok(".",100);
if(key ==-1)
{
printf("出错了\n");
return -1;
}
int id = shmget(key,4,IPC_CREAT|IPC_EXCL|0666);
printf("id = %d\n",id);
void *p = shmat (id,0,0);
int *pi = p;
*pi = P1+1 ;//子进程中对全局变量进行加1操作。父进程后续去取这个修改后的值。
shmdt(p);
exit(0);
default: //父进程
Message = "This is in the parent process,waiting the child finished........\n";
printf("pareentid=%d\n",getpid());
LoopVal = 5;
ExitCode = 15;
key_t key1 = ftok(".",100); //父进程指向子进程共享的那块内存。
int shmid1 = shmget(key1,0,0);
printf("shmid = %d\n",shmid1);
void *p1 = shmat(shmid1, 0, 0);//获取到子进程中修改后的全局变量的地址。
int *pi1 = p1;
printf("*pi1=%d\n",*pi1);//打印子进程中修改后的值。
shmdt(p1);
break;
}
printf("LoopVal=%d\n",LoopVal);
for(LoopVal1=0;LoopVal1<LoopVal;LoopVal1++)
{
puts(Message);
sleep(1);
}
if(pid!=0) //父进程
{
int StateVal;
pid_t ChildPid;
ChildPid = wait(&StateVal); //用StateVal记录状态信息
//
printf("The child has finished with the PID of %d\n",ChildPid);
if(WIFEXITED(StateVal)) //如果子进程正常结束,它就取一个非零值
{ //说明:WEXITSTATUS刚好和WIFEXITED相反,当子进程正常结束,它就取一个零值,非正常结束,取一个非零值。
printf("the child processxx has exit with code %d\n",WEXITSTATUS(StateVal));
} //如果WIFEXITED非零,它返回子进程的退出码
else
printf("the child has terminated abnormally\n");
}
printf("end--") ; //子进程非正常结束
//exit(ExitCode);
}
相关文章推荐
- 进程通信中如何进行值得传递?
- 跨进程间如何进行AIDL IPC 通信(四)
- winfrom如何通过http来进行通信,并且通过传递json格式的数据可接受json格式的数据
- 跨进程间如何进行AIDL IPC 通信(二)
- 如何:使用匿名管道在本地进程之间进行通信(C#)
- 转 winfrom如何通过http来进行通信,并且通过传递json格式的数据可接受json格式的数据
- uc_client是如何与UCenter进行通信的
- 基于select模型的tcp服务器------一个服务器如何与多个客户端进行通信?
- linux进程通信之使用匿名管道进行父子进程通信
- 如何在激活某个View时把简单对象(T类)做为参数进行传递
- WCF之旅读书笔记(2):WCF如何通过Binding进行通信
- Android如何进行网络通信(与web交互)
- 大数据日知录【第六章:分布式通信】进程和进程之间如何通信
- 两个java项目之间是如何进行通信的?
- 如何使用Prism框架的EventAggregator在模块间进行通信
- WCF后续之旅(1): WCF是如何通过Binding进行通信的
- linux下如何通过rabbitmq进行简单的电脑间通信
- 简单的,使用套接字进行TCP通信(使用进程实现并发)。
- 如何将CPoint作为SendMessage的参数进行传递
- uc_client是如何与UCenter进行通信的