当前位置: 技术问答>linux和unix
关于进程的创建和同步
来源: 互联网 发布时间:2015-01-26
本文导语: 我在程序中声明了一个全局变量a,使用fork创建子进程,并在该子进程中修改变量a的值, 当子进程结束时,在父进程中查看变量a的值,发现没有变化。 该实例说明子进程不会复制父进程的所有资源,或者却可能...
我在程序中声明了一个全局变量a,使用fork创建子进程,并在该子进程中修改变量a的值,
当子进程结束时,在父进程中查看变量a的值,发现没有变化。
该实例说明子进程不会复制父进程的所有资源,或者却可能复制了却无法修改。
由于共享内存使用的复杂性,是否有其他方法在父近程和子进程中共享变量或者结构?
另外,如果使用pthread_create()创建线程,pthread_cond_signal 和 pthread_cond_wait或者pthread_cond_timedwait的配合不是很好,主要表现在pthread_cond_signal只能激活正在等待信号的线程,如果先signal再wait,会造成死锁。由于程序中大量用到条件信号量,所以我改用创建进程的方法并使用消息队列进行同步操作。但又出现了数据共享的问题。是否有其他方法,比如实现下面这个例子
一个进程从socket取数据放进共享内存,另一个进程从共享内存取数据进行处理。该共享内存只是malloc出来,而不是使用共享内存的方法。怎样实现。
或者我只是声明一个全局结构,并同时实例引用,而不malloc或者使用共享内存,通过指针引用。即通过struct.a不通过malloc(struct);struct->a引用,怎样实现?
当子进程结束时,在父进程中查看变量a的值,发现没有变化。
该实例说明子进程不会复制父进程的所有资源,或者却可能复制了却无法修改。
由于共享内存使用的复杂性,是否有其他方法在父近程和子进程中共享变量或者结构?
另外,如果使用pthread_create()创建线程,pthread_cond_signal 和 pthread_cond_wait或者pthread_cond_timedwait的配合不是很好,主要表现在pthread_cond_signal只能激活正在等待信号的线程,如果先signal再wait,会造成死锁。由于程序中大量用到条件信号量,所以我改用创建进程的方法并使用消息队列进行同步操作。但又出现了数据共享的问题。是否有其他方法,比如实现下面这个例子
一个进程从socket取数据放进共享内存,另一个进程从共享内存取数据进行处理。该共享内存只是malloc出来,而不是使用共享内存的方法。怎样实现。
或者我只是声明一个全局结构,并同时实例引用,而不malloc或者使用共享内存,通过指针引用。即通过struct.a不通过malloc(struct);struct->a引用,怎样实现?
|
注意,你声明的变量一定要是static变量。否则,出现的问题就是你所描述的那样。原因很简单:当你通过fork调用产生一个子进程,那么将对父进程的进程空间完全拷贝,那么你修改的只是子进程的a变量。
|
linux的__clone()是一个比较灵活的函数
实际上fork(),exe家族,以及其他进程分支的函数都是通过它实现的
它可以做到直接制定资源的使用方式
也就是说,可以一一指定子进程的哪些资源拷贝是父进程的
哪些是直接用指针指向父进程的资源的(也就是父子共享)
极端的
如果所有资源都是共享的,实际上就变成一个新的“线程”了
其实,linux没有专门的线程机制,就是通过上面的方法“模拟”的
最后注意__clone()并不是unix标准接口(就是那个什么po...标准,忘了)
如果使用,就丧失了代码的可移植性
实际上fork(),exe家族,以及其他进程分支的函数都是通过它实现的
它可以做到直接制定资源的使用方式
也就是说,可以一一指定子进程的哪些资源拷贝是父进程的
哪些是直接用指针指向父进程的资源的(也就是父子共享)
极端的
如果所有资源都是共享的,实际上就变成一个新的“线程”了
其实,linux没有专门的线程机制,就是通过上面的方法“模拟”的
最后注意__clone()并不是unix标准接口(就是那个什么po...标准,忘了)
如果使用,就丧失了代码的可移植性