
可以用pthread_kill函数
传递信号SIGSTOP挂起
传递SIGCONT 恢复
调用系统的stop挂起
或者用kill -stop 挂起
类似的 用SIGCONT 恢复。
这是从别的地方摘录的,不知有没有用。vfork()
在写入时复制页面出现之前,Unix设计者已经关注fork紧跟着exec时的地址空间复制浪费问题。因此BSD开发者在3.0BSD公开了vfork()系统调用:
#include <sys/types.h>
#include <unistd.h>
pid_t vfork (void)
成功调用vfork()和fork()的行为一样,除了子进程必须立即发起一个exec函数,或者通过调用_exit()退出(下一节讨论)。vfork()系统调用避免了地址空间和页表复制,通过挂起父进程直到子进程终止或者执行新的二进制镜像。在此之间,父进程和子进程共享地址空间和页表项(虽然没有写入时复制的语义)。实际上,在调用vfork()期间唯一做的事情是复制内核内部数据结构。因此,子进程不能修改地址空间内的任何内存。
vfork()系统调用是一个历史遗物,永远不应该被Linux实现。应该指出的是,尽管fork()使用了写入时复制,vfork()也比fork()更快,因为vfork()不需要复制页表项。无论如何,写入时复制的采用,削弱了fork()其它变体的需要。实际上直到Linux内核2.2.0版本,vfork()只是fork()的简单封装。由于对vfork()的需求远远小于对fork()的需求,这样一种vfork()实现是切实可行的。
严格地说,没有哪种vfork()实现是无bug的:考虑exec调用失败的情况!父进程将被挂起不确定时间,直到子进程决定自己该怎么做或者直到子进程退出。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)