gpt4 book ai didi

c - 与 fork 子共享内存

转载 作者:太空宇宙 更新时间:2023-11-04 13:04:22 26 4
gpt4 key购买 nike

我有以下代码,它应该创建一个 fork 进程来执行 Collat​​z 猜想(基于传递的值),并将整数推送到共享内存中。当子进程完成后,父进程应该打印出这些值。出于某种原因,我的代码有时有效,但有时无效。从调试语句中,我可以看到值被插入但有时打印出值的代码似乎没有执行(只是打印了一些空行)。我在虚拟机中使用 Debian Linux。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/mman.h>

int main()
{
const int SIZE = 2048;
const char *name = "SHARON";
int shm_fd;
void *ptr;
int count = 1;

/* Setup shared memory */
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);

/* Get the starting value */
int value;
printf("Enter a positive integer value: ");
scanf("%d", &value);
printf("\n");
if (value < 0)
{
printf("ERROR: Integer value must be positive!");
return 1;
}

/* Fork child process */
pid_t pid;
pid = fork();

fork();
if (pid < 0)
{
fprintf(stderr, "FORK FAILED\n");
return 1;
}
else if (pid > 0) /*parent process*/
{
wait(); /*wait for child to send */
while (atoi((char *)ptr) != 0) /*0 is terminate value*/
{
printf("%s", (char *)ptr);
ptr += sizeof(int);
if (atoi((char *)ptr) != 0)
printf(", ");
}

printf("\n");
shm_unlink(name);
}
else if (pid == 0) /* child process */
{
sprintf(ptr, "%d", value);
ptr += sizeof(value);

while (value != 1)
{
if (value % 2 == 0)
value /= 2;
else
value = value * 3 + 1;

sprintf(ptr, "%d", value);
ptr += sizeof(value);
}
sprintf(ptr,"0"); //push a "terminate" value
ptr += sizeof(value);
}
return 0;
}

关于我做错了什么的任何提示?

最佳答案

有两个 fork() 调用。这将创建两个 child 。

  pid = fork();

//fork();

你能试试上面的吗?

关于c - 与 fork 子共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33093475/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com