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

3番目のプロセスでpid [1] = 0になるのはなぜですか?それを修正する方法はありますか?

4

3 に答える 3

5

行を印刷するプロセスは、3.何かが設定される前にすでに分岐していますpid[1]。共有メモリにないため、他のプロセスから値を格納することはできず、初期化していないため、メモリの汚れが含まれていますが、偶然にも 0 です。

配列がグローバル変数として宣言されている場合、または関数内の静的である場合、要素はまだ初期化されてい0ない限り初期化されます。 C の int 配列の初期値は読みやすいでしょう。

于 2013-05-24T10:17:06.890 に答える
0

2 つのプロセス間で何らかのシグナル交換を使用する必要があります。複雑なデータにはパイプまたは共有メモリを使用するか、単純なメッセージには単にシグナルを使用できます。

于 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 に答える