簡體   English   中英

使用信號訪問共享內存到子進程

[英]Access shared memory to child process with signal

我的 c 程序需要一些幫助。 基本上,在我的 c 程序中,我希望我的父進程計算 a+b,而我的子進程計算 3*(a+b)。 但是,我不知道發送信號后如何訪問共享內存。 任何幫助表示贊賞。

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

void sigcont(int shmid); 

int main (int argc, char *argv[]){
    int shmid;
    int *result;
    pid_t pid;

    int size_data = 2 * sizeof (int);
    shmid = shmget (IPC_PRIVATE, size_data, 0666 | IPC_CREAT);
    
    pid = fork ();
    if (pid == 0) {
        signal(SIGCONT, sigcont); 
        while (1);
    }
    else {
        sleep(1);
        result = (int *) shmat (shmid, NULL, 0);
        result[0] = atoi (argv[2]) + atoi (argv[1]);
        printf ("Result in parent process %d: %d.\n", getpid() , result[0]);
        printf ("Send a SIGCONT to process %d.\n\n", pid);
        shmdt (result);
        kill (pid, SIGCONT);
        wait(NULL);
        printf ("\nThis is the End.\n");
    }
  return 0;
}

void sigcont(int shmid){
    printf("Get a SIGCONT.\n");
    printf("Result in child process ID: %d.\n", getpid());
    exit(0);
}

我嘗試過的:

  1. 將一個參數放入 void sigcont(int shmid); 當我從https://www.geeksforgeeks.org/signals-c-set-2/學習時。 signal() 和 kill() 必須成對使用嗎? 我得到 因此,我試圖向它傳遞一個值。 不工作。

  2. Sigstop() 和 Sigcont() 我試圖避免在我的子進程中使用 signal() 以便我可以直接訪問 shmid。 但是我找不到很多 Sigstop() 和 Sigcont() 的例子。 它也失敗了。

即使看起來很簡單,也很難得到我想要的結果。 有人能幫忙嗎? 任何幫助表示贊賞。

備注:增加了錯誤檢查; fork()之前調用shmat()並保存到全局,孩子繼承附加的共享內存; SIGCONT更適合停止的進程,選擇SIGUSR1 arg 到 sig 處理程序是信號 #; 孩子在旋轉,為了最小的開銷,最好是pause()

這個版本是一個例子,並不試圖支持想象的每一個系統。

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

int *shmloc;


void shandler(int sig)
{
    printf("pid %d, sig %d\n", getpid(), sig);
    printf("mult result: %d\n", *shmloc * 3);
}


int main(int argc, char *argv[])
{
    int a, b, shmid, size_data, sig;
    pid_t pid;

    if (argc < 3) {
        fprintf(stderr, "missing args a b\n");
        return (1);
    }

    // OP: shmget() size arg, some systems may require a minimum, may roundup
    size_data = 2 * sizeof (int);
    shmid = shmget(IPC_PRIVATE, size_data, 0666 | IPC_CREAT);
    if (shmid == -1) {
        fprintf(stderr, "shmget failed, %s\n", strerror(errno));
        return (1);
    }

    shmloc = shmat(shmid, NULL, 0);
    if (shmloc == (void *) -1) {
        fprintf(stderr, "shmat failed, %s\n", strerror(errno));
        return (1);
    }

    sig = SIGUSR1;
    pid = fork();
    if (pid < 0) {
        fprintf(stderr, "fork failed, %s\n", strerror(errno));
        return (1);
    }

    // child only
    if (pid == 0) {
        signal(sig, shandler); 
        pause();
        printf("child exit\n");
        _exit(0);
    }

    sleep(1);
    // OP: care about non-digits in cmd-line args?
    a = atoi(argv[1]);
    b = atoi(argv[2]);
    *shmloc = a + b;
    printf("parent pid %d, add (%d, %d) result %d\n", getpid(), a, b, *shmloc);
    shmdt(shmloc);
    printf("sending signal %d to child %d\n", sig, pid);
    kill(pid, sig);
    wait(NULL);
    printf("\nThis is the End.\n");

    return (0);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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