[英]Linux-C Read data from shared memory it's corrupted
即時通訊寫入和讀取共享內存中的字符串。 這是我的代碼:
這是作者(我省略了無關的代碼)
int main() {
char message[MAX_BUF];
key_t key;
int sharedMemoryId;
int semaphoreId;
char *vc1;
char *data;
pid_t p3;
struct sembuf operations[1];
printf("start p2\n");
saveMesageInBuffer(message); //This reads message from pipe and saves into message variable
if(message==NULL){
return -1;
}
key = getKeyForFile();
if(key != -1){
sharedMemoryId = createSharedMemoryId(key);
if(sharedMemoryId!=-1){
vc1 = shareContentInMemoryId(sharedMemoryId);
}
switch(p3 = fork()){
case -1:
printf("Error");
break;
case 0:
printf("run\n");
execl("./Ej3", "Ej3", NULL);
break;
default:
sleep(SECONDS);
writeMessageInSharedVariable(vc1, message);
pause();
break;
}
} else {
printf("Error getting key for file: %s\n", strerror(errno));
}
return 0;
}
void writeMessageInSharedVariable(char *dest, char *message){
printf("El proceso P2 (PID=%d, Ej2) transmite un mensaje al proceso P3 a traves de una variable en memoria compartida\n", getpid());
strncpy(dest, message, MAX_BUF);
}
int createSharedMemoryId(key_t key){
return shmget(key, MAX_BUF, IPC_CREAT | 0600);
}
char* shareContentInMemoryId(int memoryId){
return shmat(memoryId, (void *)0, 0);
}
key_t getKeyForFile(){
char filePath[1024];
if (getcwd(filePath, sizeof(filePath)) != NULL){
strcat(filePath, "/");
strcat(filePath, FIFO_FILE_NAME);
return ftok(filePath, 0777);
} else {
return (key_t) -1;
}
}
`
這是閱讀器(編譯為Ej3,並通過writer的fork和exec啟動)
int main() {
key_t key;
char message[MAX_BUF];
int sharedMemoryId;
char* vc1;
printf("el 33 \n");
key = getKeyForFile();
if(key != -1){
sharedMemoryId = createSharedMemoryId(key, sizeof(message));
sleep(3);
printf("continua\n");
vc1 = (char*)shmat(sharedMemoryId, (void *)0, 0);
if (vc1 == (char *)(-1)) {
perror("shmat");
exit(1);
}
printf("Readed %s\n", vc1);
} else {
printf("Error getting key for file: %s\n", strerror(errno));
}
}
我在消息中寫測試,這是我閱讀時的結果。
閱讀測試。[]
strncpy(dest, message, MAX_BUF);
strncpy
不會使buffer空終止 。 您必須自己將其終止。
strncpy(dest, message, MAX_BUF);
dest[MAX_BUF-1] = '\0'; /* <- like this */
printf(%s
接受C字符串,它是一個char數組,結尾是一個空字符。如果不對字符串進行空終止,則printf
將不知道何時停止,因此將輸出垃圾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.