Вилка с общей памятью - PullRequest
0 голосов
/ 10 октября 2018

Я не собираюсь лгать, я полностью потерян.Я должен написать код для создания общей памяти вместе с ответвлением от строки cmd указанного числа дочерних процессов с exec.У меня есть две программы "master" и "oss", где я беру исполняемый файл "./oss" с вызовом exec.Я работаю над этим в течение двух недель, и это все, что у меня есть, поэтому я прихожу сюда в качестве крайней меры в поисках помощи / объяснений, потому что мне явно не повезло в Интернете или от моего профессора.

Раньше меня высмеивали на этой платформе за то, что я задавал простые вопросы, но как человек, который не очень знаком с системным программированием, я хотел бы просто изучить и получить представление о его теме.

"магистерская" программа:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHSIZE 100

int main( int argc, char *argv[]) {
    pid_t pid;
    pid = fork();

    int shmid, shmMsg;
    key_t key;
    char *shm;

    key = 9876;

    shmid = shmget(key, SHSIZE, 0666);
    if(shmid < 0) {
            perror("shmget");
            exit(1);
    }

    shm = shmat(shmid, NULL, 0);
    if(shm == -1) {
            perror("shmat");
            exit(1);
    }
    shmMsg = shmat(shmid, NULL, 0);
    if(shmMsg == -1) {
            perror("shmat");
            exit(1);
    }

    char *args[] = {"./oss", "-h", "-l", "-s", "-t", (char *) 0};

    if(pid < 0){
            printf("**Fork Error**\n");
            exit(1);
    }
    else if(pid == 0){
            int ex = execv("./oss", args);
            if(ex == -1)
                    printf("*Error*");
            exit(1);
    }
    printf("CLOCK");

    wait(2);
    shmdt(shm);
    shmdt(shmMsg);
    shmctl(shmid, IPC_RMID, NULL);

    return 0;
}

Программа 'oss':

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHSIZE 100

int main(int argc, char *argv[]) {

    int shmid, shmMsg, c, n;
    int getopt(int argc, char const **argv, const char *options);
    key_t key;
    char *shm;
    pid_t pid;

    key = 9876;

    /* Send shared memory of 'size' to server */  
    shmid = shmget(key, SHSIZE, IPC_CREAT | 0666);
    if(shmid < 0){
            perror("shmget");
            exit(1);
    }

    /* Attach Server to shared memory */
    shm = shmat(shmid, NULL, 0);
    if(shm == -1){
            perror("shmat");
            exit(1);
    }

    shmMsg = shmat(shmid, NULL, 0);
    if(shmMsg == -1){
            perror("shmat");
            exit(1);
    }

    /* fill clock into shared memory */
    int clk = 0;

    while((c = getopt(argc, argv, ":hlst")) != 1)
    {
            switch(c)
            {
            case 'h':

            break;

            case 'l':

            case 's':

            case 't':

            break;

            }
    }


    wait(2);
    shmdt(shm);
    shmdt(shmMsg);
    shmctl(shmid, IPC_RMID, NULL);

    return 0;
}
...