2

このプログラムは、親プロセスで文を取得し、子プロセスで大文字で出力します。子供には親を待ってもらいたい。子プロセスを待機させるために sleep() を使用しました。親を待つように子を作る方法はありますか? signal() で実装できますか? 前もって感謝します!!!

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<ctype.h>
#define size 50
main()
{
    int pid,shmid,i,key=1234;
    char *name,*shmaddr;
    if((shmid=shmget(key,size,IPC_CREAT | 0666)) < 0)
    {
        perror("shmget():");
        exit(1);
    }
    pid=fork();
    if(pid < 0)
    {
        perror("fork():");
        exit(1);
    }
    else if(pid == 0)
    {
        sleep(5); //making child to wait for parent
        printf("\t\tCHILD\n\n");
        if((shmaddr=shmat(shmid,NULL,0)) == (char*) -1)
        {
            perror("shmat():");
            exit(1);
        }
        name=shmaddr;
        i=0;
        while(name[i]!='\0')
        {
            printf("%c",toupper(name[i]));
            i++;
        }
        shmdt(shmaddr);
        printf("\n");
        exit(0);
    }
    else
    {
        printf("\t\tPARENT\n\n"); 
        if((shmaddr=shmat(shmid,NULL,0)) == (char*) -1)
        {
            perror("shmat():");
            exit(1);
        }
        name=shmaddr;
        i=0;
        while((name[i]=getchar()) != '\n')
        i++;
        name[i]='\0';
        shmdt(shmaddr);
        wait(NULL);
    }
}
4

1 に答える 1

2

子を待機させる最も簡単な方法は、パイプを使用することです。子は読み取り時にブロックし、共有メモリへの書き込みが完了すると、親はパイプに 1 バイトを書き込みます。子は、そのバイトを消費したときにのみ読み取りを通過します。(もちろん、この単純なシナリオでは、親は共有メモリではなくパイプにデータを書き込むだけなので、共有メモリは必要ありません!)

于 2013-03-11T12:45:58.310 に答える