c - 与 fork 子共享内存

标签 c linux fork shared-memory

我有以下代码,它应该创建一个 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/

相关文章:

c - 将一个 char 数组存储到另一个数组中 - c

c - 如何在 dev_t 和主要/次要设备号之间进行转换?

c++ - 字符指针等于缓冲区加上缓冲区大小?

linux - Emacs solarized 主题在终端中看起来很奇怪,暗模式不起作用

c - mingw 环境中 64 位字符串格式化程序的警告

c - 通过 pipe() 系统调用 : how to imitate pressing enter (during the input) in terminal? 向子进程传输数据

使用 htonl(inet_addr(IP_str)) 将点分 IP 转换为整数返回 B 类和 C 类 IP 地址的负值

c - 如何模拟进程运行?

C++管道问题

c - 如何测试 fork(); Windows 上的函数