其他进程中的PID错误

时间:2013-05-24 10:06:13

标签: c process fork pid

看看这段代码

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?知道怎么解决吗?

3 个答案:

答案 0 :(得分:5)

打印3.行的过程在设置pid[1]之前已经分叉。它不在共享内存中,因此没有值可以从其他进程存储到它中,并且你从未初始化它,所以它包含内存污垢,只巧巧0。

如果数组被声明为全局变量或者它是函数中的静态变量,那么除非已经初始化,否则元素将被初始化为0initial 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;
}

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