使用 execlp() 调用可执行文件

标签 c shared-memory execl

我正在尝试编译 2 个可执行文件。其中一台是采样器,另一台是收集器。必须从收集器的子级调用采样器。采样器一将一些数据写入共享内存,收集器应从共享内存中读取数据。我正在使用 execlp 来调用 Sampler,但我认为我做错了什么。它不会用下面的代码编写任何内容。但是当我手动执行 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

}

最佳答案

您应该在 execlp 调用之后添加一些错误报告。 (请记住:如果成功,exec 永远不会返回,因此如果您在 exec 之后到达该语句,则它会失败。)

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

您可能会发现它因EFAULT而失败。这是因为您正在传递 ShmID(一个整数)作为参数。 execlp 仅处理字符串。您需要将整数转换为字符串(例如使用 sprintf)并将其传递给 execlp。然后它会出现在另一个程序的 argv 中,当然它是一个字符串,因此您必须将其转换回数字。

关于使用 execlp() 调用可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30173706/

相关文章:

c - OpenMP:单一的共享变量,等待构造

c - 将管道内容打印到屏幕

c - 使用 C 将参数传递给另一个函数

c - 删除函数在 C 中不适用于特定文件但适用于其他文件

php - 函数的含义

c - 在不同类型的变量之间分配共享内存时出现段错误

linux - 执行两个字节

c - 在哪里解除分配(免费)

c - 假设我们有结构填充且 int 的大小为 4,double 的大小为 8 字节,下面这段代码中结构的大小是多少

c - 使用 ipcrm 删除共享内存 linux