1

fork() を使用して 2 つのプロセスを作成する UNIX アプリケーションを作成する必要があります。これらのプロセスは両方とも、現在の時刻を画面上の異なる位置に出力します。子プロセスが終了したら、親プロセスはその作業を停止する必要があります。私はこのコードを書きました:

#include <ncurses.h>
#include <unistd.h>
#include <time.h>
#include <wait.h>
#include <sys/types.h>

struct Point2
{
    int X;
    int Y;
};

int kbhit()
{
    //getch() implementation
}

void printTime(const struct Point2 pt, const char* st)
{
    char buf[255];
    time_t rawtime;
    struct tm * timeinfo;

    time (&rawtime);
    timeinfo = localtime(&rawtime);
    sprintf(buf, "%s: %02d:%02d:%02d", st, timeinfo->tm_hour,
            timeinfo->tm_min, timeinfo->tm_sec);
    mvaddstr(pt.Y, pt.X, buf);
    refresh();
}

void childp(pid_t pid, const struct Point2 pt)
{
    while(kbhit() != 27)
    {
        printTime(pt, "CHLD");
        usleep(1000);
    }
}

void parentp(pid_t pid, const struct Point2 pt)
{
    struct Point2 newp = {pt.X, pt.Y + 1};
    while(1)
    {
        int stat;
        waitpid(pid, &stat, WNOHANG);
        if(WIFEXITED(stat) != 0)
            break;

        printTime(newp, "PARN");
            usleep(1000);
    }
}

int main(int argc, char* argv[])
{
    if(argc != 3)
    {
        printf("unable to load XY position for clock.\n");
        return 1;
    }

    initscr();
    refresh(); // <-- this refresh

    struct Point2 opt;
    opt.X = atoi(argv[1]);
    opt.Y = atoi(argv[2]);

    pid_t pid;
    pid = fork();

    switch(pid)
    {
        case -1:
            printw("Error");
            _exit(0);
        case 0:
            childp(pid, opt);
            break;
        default:
        parentp(pid, opt);
            break;

    }
    endwin();
    return 0;
}

プログラムが開始されると、一度「CHLD」と「PARN」時刻を出力し、その後、子プロセスから「CHLD」時刻を正しく更新しますが、親プロセスからの出力は変わりません。さらに、main() の呼び出しにコメントをrefresh()付けると、「PARN」時間文字列がまったく表示されません。私の質問は、親プロセスが画面を更新しないのはなぜですか?

更新。親関数のサイクルのほとんどすべてのコードを削除しました。現在は次のようになっています。

void parentp(pid_t pid, const struct Point2 pt)
{
    struct Point2 newp = {pt.X, pt.Y + 1};
    while(1)
    {
        printTime(newp, "PARN");
    }
}

しかし、それはまだ機能していません

4

1 に答える 1

0

waitpid(pid, &stat, WNOHANG);正しく動作しました。理由はわかりませんが、問題はmvaddstr();printw() に変更したところにあり、ほら、うまくいきました! mvaddstr();画面全体が更新されないために発生している可能性があります。もう 1 つの方法は、fork() を呼び出す前に PARN と CHLD の時間を描画することですが、これは単純でも洗練された解決策でもないと思います。使用済みprintw().

于 2013-09-05T20:18:26.743 に答える