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");
}
}
しかし、それはまだ機能していません