0
#include<apue.h>
#include<signal.h>

static void charatatime(char *str)
{
    char *ptr;
    int c;
    setbuf(stdout,NULL);
    for (ptr = str;(c = *ptr++) != 0;)
        putc(c,stdout);
}

int main(int argc , char *argv[])
{
    pid_t   pid;
    int i;
    TELL_WAIT();

    if ((pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0)
    {

        for (i = 0;i < 10;++i)
        {
            WAIT_PARENT();
            charatatime("ouput from child\n");
        }

        exit(0);
    }
    else
    {

        for (i = 0;i < 10;++i)
        {
            charatatime("output from parent\n");
            TELL_CHILD(pid);
        }
    }
    return 0;
}

ループなしで2回印刷するだけで正しく動作しますが、ループでさらに印刷しようとするとひどいようです....for親プロセスは終了後に子プロセスを待つべきだと思いますTELL_CHILD(pid)....

4

1 に答える 1

1

あなたの問題は、書き込み後、親が子が引き継ぐのを待たないことです。したがって、コードは、親が少なくとも 1 回書き込みを行った後にのみ、子が書き込みを行うことを確認します。

コードをテストできないので、エラーをチェックしますが、次のようなものがうまくいくかもしれません:

#include<apue.h>
#include<signal.h>

static void charatatime(char *str)
{
    char *ptr;
    int c;
    setbuf(stdout,NULL);
    for (ptr = str;(c = *ptr++) != 0;)
        putc(c,stdout);
}

int main(int argc , char *argv[])
{
    pid_t   pid;
    int i;
    TELL_WAIT();

    if ((pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0)
    {
        TELL_PARENT();

        for (i = 0;i < 10;++i)
        {
            WAIT_PARENT();
            charatatime("ouput from child\n");
            TELL_PARENT();
        }

        exit(0);
    }
    else
    {

        for (i = 0;i < 10;++i)
        {
            WAIT_CHILD(pid);
            charatatime("output from parent\n");
            TELL_CHILD(pid);
        }
    }
    return 0;
}
于 2012-09-27T14:15:06.913 に答える