1

私は宿題の問題に取り組んでおり、fork() と共有メモリ オブジェクトを使用して C で collat​​z 予想の実装を記述し、子プロセスで計算を実行し、親プロセスで結果を出力しています。私は C にあまり詳しくないので、多くのツールを学んでいます。親プロセスのオブジェクトにアクセスしようとすると、gdb を使用して segfault を特定しました。私が使用しているコードは次のとおりです。

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/mman.h>
#include <math.h>

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

const int SIZE  = 4096;
const char *name = "SM";
int shm_fd;
void  *ptr;

pid_t child;


if ((argc != 2) || (strtol(argv[1],NULL, 10) <= 0))
{
        printf("Invalid usage: requires 1 positive integer parameter\n");
        return -1;
}

child = fork();
if(child >=0 )
{
        if (child == 0)
        {
                shm_fd = shm_open(name, O_CREAT || O_RDWR, 0666);
                ftruncate(shm_fd, SIZE);
                ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);
                int currentval = strtol(argv[1],NULL,10);
                sprintf(ptr,"%d",currentval);
                ptr++;/*  floor(log10(abs(currentval))) + 1;*/
                while (currentval > 1)
                {
                        sprintf(ptr, ", ");
                        ptr += 2;
                        if (currentval % 2 == 1)
                        {
                                currentval = currentval * 3 + 1;
                                sprintf(ptr, "%d", currentval);
                                ptr++;
                        }
                        else
                        {
                                currentval = currentval/2;
                                sprintf(ptr, "%d", currentval);
                                ptr++;
                        }
                }
                sprintf(ptr, "\n");
                ptr+= 1;
                return 0;
        }
        else
        {
                wait();

                shm_fd = shm_open(name, O_RDONLY, 0666);
                ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0);
                printf("%s\n",(char *)ptr);
                shm_unlink(name);
                return 0;
        }
}
else
{
        printf("error creating child process\n");
}
return 0;
}

これまでセグメンテーション違反をデバッグしたことがないので、アドバイスをいただければ幸いです。前もって感謝します。

4

3 に答える 3

1

問題が見つかりました。ビットごとの OR ではなく論理 OR を実行していたため、不適切なファイル記述子が作成されていました。

shm_fd = shm_open(名前, O_CREAT || O_RDWR, 0666);

になるはずだった

shm_fd = shm_open(名前, O_CREAT | O_RDWR, 0666);

于 2013-10-02T17:35:44.557 に答える
0

gdb を使用して作成されたコア ファイルのバックトレースを貼り付けていただけますか。

gdb -c <core file> <executable>

gdb でコアを開き、「bt」と入力します。これにより、問題が発生した正確な場所が得られます。その出力をここに貼り付けることもできます。

于 2013-09-30T04:07:29.297 に答える