gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:14:49 36 4
gpt4 key购买 nike

我正在尝试编译 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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com