最近学习到linux进程控制,对于一些基本的函数有所了解,例程在教材程序的基础上修改,用gtk的方式输出进程创建的结果(不过是简单的对话框弹出方式确定)。
/****forktest.c****/
#include <stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<gtk/gtk.h>
int main(int argc,char** argv)
{
int i;
int p_id;
if((p_id=fork())==0)
{
for(i=1;i<3;i++){
//gtk函数的使用,创建进程则显示为创建window
//printf("This is child process\n");
gtk_init(&argc,&argv);
GtkWidget* child_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);;
gtk_window_set_default_size(GTK_WINDOW(child_win),200,200);
GtkWidget* cb = gtk_label_new("this is child process!");
gtk_container_add(GTK_CONTAINER(child_win),cb);
//显示main_win及其所有子widgets
gtk_widget_show_all(child_win);
gtk_main();
}
}
else if(p_id==-1)
{
printf("fork new process error!\n");
exit(-1);
}
else
{
for(i=1;i<3;i++){
//printf("This is parent process\n");
gtk_init(&argc,&argv);
GtkWidget* parent_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);;
gtk_window_set_default_size(GTK_WINDOW(parent_win),200,200);
GtkWidget* pb = gtk_label_new("this is parent process!");
gtk_container_add(GTK_CONTAINER(parent_win),pb);
//显示main_win及其所有子widgets
gtk_widget_show_all(parent_win);
gtk_main();
}
}
return 0;
}
在终端中打开运行这个程序,进入到文件所在目录,在终端中输入:
$ gcc forktest.c -o base `pkg-config --cflags --libs gtk+-2.0`
这时不会有什么效果,但在文件目录中会生成一个forktest.o的文件,这时即按照常规的做法,在终端中继续输入:
$ ./forktest
效果:
在屏幕上会出现两个重叠的窗口:
将窗口移开,可以看到后面重叠的窗口。
这就是显示的效果,当然,程序本来的意图,在运行程序时并不能完全看出运行的实质。
fork()函数创建进程时,子进程只是完全复制父进程的资源,子进程的执行独立于父进程,因而具有良好的并发性。