我正在尝试编译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
}
答案 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);
int execlp(const char * file,const char * arg,...);
ShmID
不是const char *
。