簡體   English   中英

Linux-C從共享內存中讀取已損壞的數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM