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

时间:2015-05-11 17:12:30

标签: c shared-memory execl

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

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

}

2 个答案:

答案 0 :(得分:0)

您应在execlp电话后提出一些错误报告。 (请记住:如果exec成功,exec永远不会返回,所以如果你在exec之后到达声明,它就会失败。)

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

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

答案 1 :(得分:0)

您的execlp()来电错误。

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

the man page

  

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

ShmID不是const char *