📄 draw.c
字号:
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <time.h>
#include <curses.h>
#include <stdio.h>
#define MAX_CHILD 3 /* 本主程序产生3个子进程 */
int draw1(void) { /* draw1()是子进程1调用的画图的函数,draw2(),draw3()功能类似*/
int x_loop;
int y_loop; /* 循环体中用到的坐标,标识光标在新窗口的位置 */
WINDOW *new_window_ptr1; /* 新建窗口的指针 */
char zhzhxiao[8]={'z','h','z','h','x','i','a','o'};
int count1;
sleep(1);
new_window_ptr1=newwin(5,30,1,0); /* 产生1个新窗口,位置在标准终端(显示器)0,1的地方,大小为10,20 */
box(new_window_ptr1,'|','-'); /* 给新窗口加边框 */
mvwprintw(new_window_ptr1,2,2,"%s","Author:"); /* 移动光标的位置,在新窗口的2,2处输出字符串 */
wrefresh(new_window_ptr1);
refresh(); /* 每次在终端上画出新的内容都需要刷新窗口才能正确显示 */
sleep(2);
for(count1=0;count1<8;count1++){
mvwaddch(new_window_ptr1,3,2+count1,zhzhxiao[count1]); /* 使用mvwadch()函数在新窗口下输出数组中的内容 */
wrefresh(new_window_ptr1);
refresh();
sleep(1);
}
exit(0);
}
int draw2(void) {
int x_loop;
int y_loop;
WINDOW *new_window_ptr2;
char class[6]={'C','S','0','2','0','1'};
int count2;
sleep(1);
new_window_ptr2=newwin(5,30,7,0);
box(new_window_ptr2,'|','-');
mvwprintw(new_window_ptr2,2,2,"%s","Class:");
wrefresh(new_window_ptr2);
refresh();
sleep(2);
for(count2=0;count2<6;count2++){
mvwaddch(new_window_ptr2,3,2+count2,class[count2]);
wrefresh(new_window_ptr2);
refresh();
sleep(1);
}
exit(0);
}
int draw3(void) {
int x_loop;
int y_loop;
WINDOW *new_window_ptr3;
char xuehao[12]={'0','1','2','0','0','2','0','1','3','3','2','4'};
int count3;
sleep(1);
new_window_ptr3=newwin(5,30,14,0);
box(new_window_ptr3,'|','-');
mvwprintw(new_window_ptr3,2,2,"%s","xuehao:");
wrefresh(new_window_ptr3);
refresh();
sleep(2);
for(count3=0;count3<12;count3++){
mvwaddch(new_window_ptr3,3,2+count3,xuehao[count3]);
wrefresh(new_window_ptr3);
refresh();
sleep(1);
}
exit(0);
}
int main(void)
{
pid_t pid;
pid_t ids[MAX_CHILD]; /* 此数组将程序产生的3个子进程在系统中的标识ID存放起来 */
int n;
initscr();
refresh(); /* 初始化屏幕 */
n = 0;
do {
pid = fork(); /* 每次fork()都能产生新的子进程 */
n++;
switch (pid) {
case -1: /* 对应fork()失败的情形 */
exit(-1);
break;
case 0: if(n==1) draw1();
if(n==2) draw2();
if(n==3) draw3(); /* 运行到case 0的都是子进程,他们分别调用3个函数来画图 */
break;
default: ids[n-1]=pid; /* 运行到这里的是父进程,此时pid为他产生的子进程在系统内的ID */
break;
}
}while (pid!=0&&n<MAX_CHILD); /* 父进程会循环fork()三次,产生3个子进程 */
for(n=0;n<MAX_CHILD;n++)
wait(ids[n]); /* 父进程作为守护进程,等待3个子进程都死亡自己才退出 */
sleep(10);
touchwin(stdscr);
refresh();
endwin();
exit(0); /* 父进程恢复原屏幕并退出 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -