0

私はこのコードを書いています。これは基本的に、必要な子スレッドの数を指定する引数を取り、フォークしてそれらを取得し、配列に格納されているすべての pid を出力します。

親だけが PID を必要とする場合はこれで問題ありませんが、子も IDS (pcid) を取得する必要があります。ネットからいくつかのコードをコピーして貼り付けたので(よくわかりませんでした)、なぜ機能しないのかわかりません。

最初の PID が印刷された後、セグメンテーション エラーが発生します。

ここで何が問題なのですか?

#include <stdio.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/shm.h>
#include <sys/ipc.h>

int main(int argc, char *argv[])
{

if(argc  < 2) {
printf("ERROR: No arguments fed.\n");
exit(-1);
}

int amount = atoi(argv[1]);
int i;
int pid = 1;
int pcid = 0;
key_t key;
int shmid;
int *arr[amount];

key = ftok("thread1.c",'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);

for(i = 0; i < amount; i++) 
{
    if(pid != 0) 
    {
        pid = fork();
    }
    *arr = shmat(shmid, (void *) 0, 0);
    if(pid != 0) 
    {
    *arr[i] = pid;
    }
    else 
    {
    pcid = *arr[i];
    break;
    }
}
if(pid != 0) 
{

    printf("Printing PID Array:\n");
    for(i =0; i < amount; i++) 
    {
        printf("%d\n", *arr[i]);
    }
}    
else 
{
    printf("My PID: %d\n",pcid);
}


}    
4

1 に答える 1

0

ポインターの配列を使用しています。そして、*arr = shmat(shmid, (void *) 0, 0)配列の最初の要素に共有メモリ アクセス ポイントを割り当てました。これを使用*arr[i] = pidすると、不明なアドレスが残っている配列i+1要素に移動し、そこに値を入れようとします。したがって、セグメンテーション違反が発生しました。

于 2012-09-17T07:38:03.780 に答える