共享内存的前叉

时间:2018-10-10 20:11:14

标签: fork exec shared-memory

我不会撒谎,我完全迷失了。我必须编写代码来创建共享内存,并用exec分叉指定数量的子进程的cm​​d行。我有两个程序“ master”和“ oss”,在这里我通过exec调用获取可执行文件“ ./oss”。我已经进行了两个星期的工作,这就是我所拥有的,所以我来这里是最后的寻求帮助/解释的方法,因为我显然没有互联网或我的教授的运气。

在问这个简单的问题之前,我曾在这个平台上被嘲笑过,但是作为一个对系统编程不太熟悉的人,我希望简单地学习并了解他的主题。

“主”程序:

#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;
}

0 个答案:

没有答案