【问题标题】:IPC between parent and 1 child.父母和 1 个孩子之间的 IPC。
【发布时间】:2017-04-20 15:55:52
【问题描述】:

我正在练习父进程和 1 个子进程之间的进程通信。我想要做的是孩子发送给父母的每条消息都会阅读它(某种阻塞发送,父母必须先阅读消息,然后孩子继续发送另一条消息)。我不能使用管道。我读过关于阻止发送的 Silberschatz 书,但我还没有找到一个很好的例子(也许邮箱也是)。你能帮忙的话,我会很高兴! 这是一段代码:

int main(int argc, char** argv) {
printf("This process: ");
printf("%d\n",getpid());
printf("Parent: ");
printf("%d\n",getppid());
pid_t f;
int input;
f = fork();
if (f == 0) {
    for(int i=0;i<5;i++){
        printf("Input a number: ");
        scanf("%d",&input);
        send(getppid(),input);
    }
    printf("\n");
    exit(0);
} else { 
recv(f,input);
printf("%d",input);
}
wait();
exit(0);

}

【问题讨论】:

  • 这是做什么的?它有什么作用?它没有做什么(你期望它做的)?
  • 我在孩子上输入一个数字->父母阅读它->在孩子上再次输入->父母阅读等等。我只是做了一个只有 5 个数字的简单案例
  • send 不能解决您的问题,您绝对不能像套接字文件描述符一样在 pid 上调用它。
  • 我从未见过send()recv() 的两个参数版本。
  • 我的解决方案是在管道上吗? (我从上面提到的书中得到了 2 个 arg 发送和接收:P)

标签: c ipc


【解决方案1】:

这是一个可怕的黑客,但有效:/ 您应该对共享内存使用信号量或某种信号。 为 ftok 创建文件 (createthisfile.txt)。 这是对共享内存块进行密集轮询,并使用“代码”(int = 99)来指示父级,子级 for 循环已完成。请注意,99 不能用作数字,否则父级将提前退出。最后一点,你正在研究这个,那么你应该自己解决你的问题,获得提示和提示,但不要让别人为你工作:/否则你将主修 stackoverflow,而不是计算机科学 :) 我做了这是一个快速练习,但很遗憾发布它:/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>

int main(int argc, char** argv) {
   key_t k;
   pid_t f;
   int shmid;
   int input;

   printf("This process: ");
   printf("%d\n",getpid());
   printf("Parent: ");
   printf("%d\n",getppid());

   k = ftok ("createthisfile.txt", 'R');
   shmid = shmget(k, sizeof(int), IPC_CREAT|SHM_R|SHM_W);
   char *addr = shmat(shmid,0,0);

   f = fork();

   if (f == -1) {
      exit(1);
   }

   if (f == 0) {
      for(int i=0;i<5;i++){
         printf("Input a number: ");
         scanf("%d",&input);
         memcpy(addr, &input, sizeof(int));
      }
      input = 99;
      memcpy(addr, &input, sizeof(int));
      printf("\n");
      exit(0);
   } else { 
      while (1) {
         memcpy(&input, addr, sizeof(int));
         if (input != 0) { 
            if (input == 99) {
               exit (0);
            }
            printf("[Parent reads: %d]\n",input);
            input = 0;
            memcpy(addr, &input, sizeof(int));
         }
      }
   }

   exit(0);
}

【讨论】:

  • 非常好!我已经(2 分钟前)也有一个工作了!会检查你的!。
  • 很好,恭喜。如果您找到解决方案,确实会更快乐。
  • 我用消息队列做到了,像这样:chuidiang.org/clinux/ipcs/cola1.c
  • 顺便说一句,tyvm 的帮助! ^^
  • 文件中建议的 ftok 确实更好,因为 /bin/ls 已经存在(至少在 linux 上)。尝试使用此解决方案并对其进行改进。总帐
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 2017-08-26
  • 2018-02-26
  • 2015-01-18
  • 2011-02-21
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
相关资源
最近更新 更多