看看这段代码
int main(int argc, char **argv)
{
int pid[3];
int i,tmp;
pid[0]=getpid();
if((tmp=fork()) == 0)
{
pid[2]=getpid();
printf("3. PIDY %d %d %d\n", pid[0], pid[1], pid[2]);
}
else
{
pid[2]=tmp;
if((tmp=fork()) == 0)
{
pid[1]=getpid();
printf("2. PIDY %d %d %d\n", pid[0], pid[1], pid[2]);
}
else
{
pid[1]=tmp;
printf("1. PIDY %d %d %d\n", pid[0], pid[1], pid[2]);
}
}
return 0;
}
在输出上我得到了那样的东西:
1. PIDY 101 102 103
2. PIDY 101 102 103
3. PIDY 101 0 103
我想知道为什么我在第3个过程中获得pid [1] = 0?知道怎么解决吗?
答案 0 :(得分:5)
打印3.
行的过程在设置pid[1]
之前已经分叉。它不在共享内存中,因此没有值可以从其他进程存储到它中,并且你从未初始化它,所以它包含内存污垢,只巧巧0。
如果数组被声明为全局变量或者它是函数中的静态变量,那么除非已经初始化,否则元素将被初始化为0
。 initial value of int array in C会很好读。
答案 1 :(得分:0)
您必须在两个进程之间使用某种信号交换。您可以使用管道或共享内存来处理复杂数据,也可以只是简单信息的信号。
答案 2 :(得分:0)
我用这种方式解决了问题,更多的代码,但我没有任何其他想法来解决它(我没有共享内存和管道的经验) 看一看:
FILE * fp;
int pid[3];
void ReadPid()
{ // odczytanie pidow
fp = fopen("/tmp/pid","r");
int r=sizeof(int)*3;
int readed;
char * out = (char*) pid;
while(r>0)
{
readed = fread(out,1,sizeof(pid),fp);
if(readed!= EOF)
{
out+=readed;
r-=readed;
}
}
fclose(fp);
}
int main(int argc, char **argv)
{
int i,tmp;
fp = fopen("/tmp/pid","w");
if(fp==NULL) err("nie mozna otworzyc pliku /tmp/pid");
if((pid[2]=fork())==0)
{
ReadPid();
printf("3. PIDY %d %d %d\n", pid[0], pid[1], pid[2]);
}
else
if((pid[1]=fork())==0)
{
ReadPid();
printf("2. PIDY %d %d %d\n", pid[0], pid[1], pid[2]);
}
else
if((pid[0]=fork())==0)
{
ReadPid();
printf("1. PIDY %d %d %d\n", pid[0], pid[1], pid[2]);
}
else
{
fwrite(pid,1,sizeof(pid),fp);
fclose(fp);
}
return 0;
}
如果您有任何其他想法,请发布