这是我的代码。
int main(int argc, char *argv[]) {
int shmid;
char *shmc;
char *shmp;
pid_t pid;
shmid = shmget(IPC_PRIVATE, 3 * sizeof(char), 0666 | IPC_CREAT);
pid = fork();
if (pid == 0) {
shmc = (char *) shmat(shmid, NULL, 0);
shmc[0] = argv[1];
shmc[1] = argv[2];
shmc[2] = argv[3];
shmdt(shmc);
}else{
wait(NULL);
shmp =(char*) shmat(shmid,NULL, 0);
char *arg_vec[]={"./test", &shmp[1], &shmp[2],NULL};
execv("./test", arg_vec);
shmdt(shmp);
shmctl(shmid, IPC_RMID, NULL);
}
} char *arg_vec[]={"./test", &shmp[1], &shmp[2],NULL};在这一行中,我试图将2,3传递给另一个c程序。但是它通过了23和3。我想知道为什么以及如何解决这个问题。任何帮助都是非常感谢的。谢谢。
发布于 2020-09-29 21:03:53
函数execv需要一个指向字符串的指针数组。您提供的内容与类型匹配,但与背后的逻辑不匹配:
char *arg_vec[]={"./test", &shmp[1], &shmp[2],NULL};用于初始化参数数组的地址只是指向单个char的指针,没有字符串。
在shmp中,所有元素只有一个字节,并且它们位于连续的内存地址。没有地方可以放置一些可以使数组成为有效字符串的终止0字节。
您需要提供并初始化更多的空格:(假设您可以确保数字只有1位)
shmid = shmget(IPC_PRIVATE, 3 * sizeof(char[2]), 0666 | IPC_CREAT);
char (*shmc)[2] = shmat(shmid, NULL, 0);
sprintf(shmc[0], "%d", number[0]);
...
char (*shmp)[2] = shmat(shmid, NULL, 0);
printf("%s, %s\n",shmp[1], shmp[2]);
char *arg_vec[]={"./test", shmp[1], shmp[2], NULL};我把它留给你来确保合适的长度,并在你需要更大的数字的情况下进行调整。
https://stackoverflow.com/questions/64119159
复制相似问题