从运行结果可知父亲进程、女儿进程、儿子进程并发执行。 如果在每个printf后面加上sleep(1),结果如下:
…
从运行结果可知加上sleep后父进程和两个子进程并发程度更大。
8.编写一个程序,该程序当我们输入Ctrl+C时输出字符串“ I got signal”。在其余的时间,该程序只是无限循环,
每一秒输出一条“hello world”信息。 答:
#include
printf(\ (void) signal(SIGINT,SIG_DFL); }
int main() {
(void) signal(SIGINT,ouch); while(1) {
printf(\ sleep(1);
} }
9.编写程序,实现简单shell的基本功能。读入用户从键盘输入的命令,并执行它。 答:
#include
10.利用文件系统的系统调用creat()、open()、read()、write()、close()编写一个程序,把一个文件读出写到另一个文件中,实现简单的copy功能。 答:
main(argc,argv) int argc; char *argv[]; {int fd1,fd2,n;
char command[32]; char * prompt=\
while (printf(\{
if (fork()==0)
execlp(command,command,(char*)0); wait(0); else
}
char buf[512];
fd1=open(argv[1],0); fd2=creat(argv[2],0644); while((n=read(fd1,buf,512))>0) write(fd1,buf,n); close(fd1); close(fd2); }
第8章 习题答案
1. GTK+基于什么语言编写的?它与gnome有什么联系?
答:基于C语言编写的图形类库,gnome就是基于GTK图形库编写的Linux图形操作界面,由于gnome的流行,使得GTK编程成为Linux的图形化编程的主流。
2. GTK+和哪些函数库存在着依赖关系?
答:Glib,Pango,ATK,GDK,GdkPixbuf,Cairo。 3. 什么是GTK+信号?它和Linux中的信号概念一致吗?
答:信号(Signal)是GTK中出现的新的并且比较重要的概念。注意这里讲的“信号”不同于UNIX,Linux的signal,只是名称一样。当处理X事件时,如键盘按键按下,GTK的组件接收到这一事件,便发出响应的信号。类似于Windows编程中的消息事件机制。
4. 简述GTK+信号与回调过程?
答:使用函数gtk_signal_connect把组件object与回调函数func联系起来,name 是所发出的信号的名称。func_data是传递给回调函数的参数。比如要使一个按钮执行一个动作,就需用此函数设置信号和信号处理函数之间的连接。
gint
gtk_signal_connect(GtkObject
*object,gchar
*name,
GtkSignalFunc
func,gpointer func_data );
回调函数的格式如下,其中widget是发出信号的组件,callback_data是传递参数的指针。 void callback_func(GtkWidget *widget,gpointer callback_data); 5. 简述编写GTK+程序的步骤?
答:步骤如下:初始化,创建主窗口,创建并加入子窗口,设置组件回调,显示窗口,进入事件循环。 6. GTK+程序的编译参数都代表什么意义?
答:`gtk-config--cflags`产生编译GTK所使用的头文件位置,`gtk-config--libs`产生连接gtk程序编译时所使用的库。pkg-config --cflags gtk+-2.0就是列出include目录,pkg-config --libs gtk+-2.0就是列出编译连接库,也可以合在一起使用如:pkg-config --cflags --libs gtk+-2.0。
7. 用GTK+编写一个类似于Windows下的计算器程序。
答:源代码仅供参考: #include
gint s=0;
gboolean first=TRUE; gboolean have_dot=FALSE; gboolean have_result=FALSE; gchar number[100]; void clear_all(void) {
gint i=0;
gtk_entry_set_text(GTK_ENTRY(entry),\ nn=0; mm=0; s=0; count=0; first=TRUE; have_dot=FALSE; have_result=FALSE; for(i=0;i<100;i++) number[i]='\\0'; }
void on_num_clicked(GtkButton *button,gpointer data) {
const gchar *num; gint i; if(have_result) clear_all(); if(count==6) return; count++;
num=gtk_button_get_label(GTK_BUTTON(button)); i=g_strlcat(number,num,100); if(first)
nn=strtod(number,NULL); else
mm=strtod(number,NULL);
gtk_entry_set_text(GTK_ENTRY(entry),number); }
void on_dot_clicked(GtkButton *button,gpointer data) { gint i;
if(have_result) clear_all(); if(have_dot==FALSE)
{
have_dot=TRUE;
i=g_strlcat(number,\
gtk_entry_set_text(GTK_ENTRY(entry),number); } }
void on_clear_clicked(GtkButton *button,gpointer data) {
clear_all(); }
void on_suan_clicked(GtkButton *button,gpointer data) {
gint i;
switch(GPOINTER_TO_INT(data)) {
case 1:
gtk_entry_set_text(GTK_ENTRY(entry),\ s=1; first=FALSE; count=0; break; case 2:
gtk_entry_set_text(GTK_ENTRY(entry),\ s=2; first=FALSE; count=0; break; case 3:
gtk_entry_set_text(GTK_ENTRY(entry),\ s=3; first=FALSE; count=0; break; case 4:
gtk_entry_set_text(GTK_ENTRY(entry),\ s=4; first=FALSE; count=0; break; }
have_dot=FALSE;