3

看看这段代码

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

我想知道为什么我在第三个进程中得到 pid[1] = 0 ?知道如何解决吗?

4

3 回答 3

5

打印该3.行的过程在任何设置之前就已经分叉了pid[1]。它不在共享内存中,因此其他进程无法将任何值存储到其中,并且您从未对其进行初始化,因此它包含内存污垢,巧合的是0。

如果数组被声明为全局变量或者它是函数中的静态变量,那么0除非已经初始化,否则元素将被初始化。 C 中 int 数组的初始值将是一个很好的阅读。

于 2013-05-24T10:17:06.890 回答
0

您必须在两个进程之间使用某种信号交换。您可以将管道或共享内存用于复杂数据,或者仅将信号用于简单消息。

于 2013-05-24T11:21:19.653 回答
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;
}

如果你有任何其他想法,请发布它

于 2013-05-24T12:55:33.563 回答