函数
这是我的代码。
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。我想知道为什么以及如何解决这个问题。感谢您的帮助。非常感谢。
execv
需要一个指向字符串的指针数组。您提供的内容与类型匹配,但与背后的逻辑不匹配:
char *arg_vec[]={"./test", &shmp[1], &shmp[2],NULL};
用于初始化参数数组的地址只是指向单个char
的指针,而不是字符串。
在shmp
中,所有元素只有1个字节,并且它们位于连续的存储器地址。没有任何位置可以容纳某些终止的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, %sn",shmp[1], shmp[2]);
char *arg_vec[]={"./test", shmp[1], shmp[2], NULL};
我把它留给你,以确保合适的长度,并在你需要更大的数字时进行调整。