0

我正在尝试编译 2 个可执行文件。其中一个是采样器,另一个是收集器。采样器必须从收集器的子代​​中调用。采样器一将一些数据写入共享内存,收集器应从共享内存中读取数据。我正在使用 execlp 调用 Sampler,但我认为我做错了什么。它没有用下面的代码写任何东西。但是当我手动执行采样器时,它会将数据写入共享内存,然后当我执行收集器时,它可以正确读取数据。不久 execlp 函数不会正确调用采样器。为什么?

pid = fork();
if (pid == 0) {
  execlp("/home/gizux/Belgeler/ogr1grp14pro2/Sampler1","/home/gizux/Belgeler/ogr1grp14pro2/Sampler1", ShmID, NULL);
  exit(0);
}
else
{
//collector codes come here

}

如果我不使用 execlp() 并将 Sampler 的代码放在那里,它就可以工作。

pid = fork();
if (pid == 0) {
  ShmID = shmget(55667, 4*sizeof(int), IPC_CREAT | 0666);
  if (ShmID < 0) {
    printf("*** shmget error (server) ***\n");
    exit(1);
  }

  ShmPTR = (int *) shmat(ShmID, NULL, 0);
  if ((int) ShmPTR == -1) {
    printf("*** shmat error (server) ***\n");
    exit(1);
  }

  int random;

  random = rand()%100+1;

  ShmPTR[0] = r;
  ShmPTR[1] = random;

  r++;
  random = 0;
  printf("Sampler has filled %d %d in shared memory...\n",
        ShmPTR[0], ShmPTR[1]);

  exit(0);
}
else
{
//collector codes come here

}
4

2 回答 2

0

你应该在你的execlp电话之后写一些错误报告。(记住:如果成功,exec 永远不会返回,所以如果你在 exec 之后到达语句,它就会失败。)

execlp(...);
perror("execlp failed");

您可能会发现它与EFAULT. 这将是因为您将ShmID整数作为参数传递。execlp只处理字符串。您需要将整数转换为字符串(例如 with sprintf)并将其传递给execlp. 然后它会出现在另一个程序的argv中,当然它是一个字符串,所以你必须将它转换回一个数字。

于 2015-05-11T17:19:53.160 回答
0

你的execlp()电话是错误的。

  execlp("/home/gizux/Belgeler/ogr1grp14pro2/Sampler1","/home/gizux/Belgeler/ogr1grp14pro2/Sampler1", ShmID, NULL);

根据手册页

int execlp(const char *file, const char *arg, ...);

ShmID不是一个const char *

于 2015-05-11T19:00:16.843 回答