这是我的代码。
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。我想知道为什么以及如何解决该问题。任何帮助表示赞赏。谢谢。
答案 0 :(得分:2)
函数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, %s\n",shmp[1], shmp[2]);
char *arg_vec[]={"./test", shmp[1], shmp[2], NULL};
我把它留给您,以确保适当的长度并在您需要更大数量的情况下进行调整。