子进程中修改了程序的某个全局变量的值,如何在其他子进程中或者父进程中取得修改后的值,除了连数据库之外,还可以通过共享内存来获取。
举例说明:
#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
");
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
",getpid());
LoopVal = 7;
ExitCode = 24;
key_t key = ftok(".",100);
if(key ==-1)
{
printf("出错了
");
return -1;
}
int id = shmget(key,4,IPC_CREAT|IPC_EXCL|0666);
printf("id = %d
",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........
";
printf("pareentid=%d
",getpid());
LoopVal = 5;
ExitCode = 15;
key_t key1 = ftok(".",100); //父进程指向子进程共享的那块内存。
int shmid1 = shmget(key1,0,0);
printf("shmid = %d
",shmid1);
void *p1 = shmat(shmid1, 0, 0);//获取到子进程中修改后的全局变量的地址。
int *pi1 = p1;
printf("*pi1=%d
",*pi1);//打印子进程中修改后的值。
shmdt(p1);
break;
}
printf("LoopVal=%d
",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
",ChildPid);
if(WIFEXITED(StateVal)) //如果子进程正常结束,它就取一个非零值
{ //说明:WEXITSTATUS刚好和WIFEXITED相反,当子进程正常结束,它就取一个零值,非正常结束,取一个非零值。
printf("the child processxx has exit with code %d
",WEXITSTATUS(StateVal));
} //如果WIFEXITED非零,它返回子进程的退出码
else
printf("the child has terminated abnormally
");
}
printf("end--") ; //子进程非正常结束
//exit(ExitCode);
}