all:这是我的服务器内存信息'free -m'
total used free shared buffers cached
Mem: 64433 49259 15174 0 3 31
-/+ buffers/cache: 49224 15209
Swap: 8197 184 8012
Run Code Online (Sandbox Code Playgroud)
我的redis-server使用了46G内存,剩下几乎15G的内存空闲
据我所知,fork是写入时的副本,当有15G可用内存时它不应该失败,这足以malloc必要的内核结构.
此外,当redis-server使用42G内存时,bgsave还可以,fork也可以.
是否有任何vm参数我可以调整以使fork返回成功?
谢谢.
请考虑以下代码段:
pid_t cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { // in child
execvp(argv[1], argv + 1);
perror("execvp");
_exit(EXIT_FAILURE);
}
// in parent
Run Code Online (Sandbox Code Playgroud)
如果execvp返回,我该如何退出子进程?我应该使用exit()或_exit()吗?
我有一个长期运行的,守护进程的Python进程,它使用子进程在发生某些事件时生成新的子进程.长时间运行的进程由具有超级用户权限的用户启动.我需要它生成的子进程作为不同的用户(例如,"nobody")运行,同时保留父进程的超级用户权限.
我正在使用
su -m nobody -c <program to execute as a child>
Run Code Online (Sandbox Code Playgroud)
但这似乎是重量级的,并不会非常干净地死去.
有没有办法以编程方式完成此操作而不是使用su?我正在查看os.set*uid方法,但Python std lib中的doc在该领域非常稀少.
目前我正在学习fork(),并execv()和我有关于组合的效率问题.
我看到了以下标准代码:
pid = fork();
if(pid < 0){
//handle fork error
}
else if (pid == 0){
execv("son_prog", argv_son);
//do father code
Run Code Online (Sandbox Code Playgroud)
我知道fork()克隆整个过程(复制整个堆等)并execv()用新程序替换当前地址空间.考虑到这一点,使用这种组合不是非常低效吗?我们正在复制进程的整个地址空间,然后立即覆盖它.
所以我的问题是:
即使我们有浪费,使用这个组合(而不是其他解决方案)使人们仍然使用它的优势是什么?
让我解释一下:我已经在Linux上开发了一个应用程序,它分叉并执行外部二进制文件并等待它完成.结果由fork +进程独有的shm文件传递.整个代码封装在一个类中.
现在我正在考虑线程化这个过程以加快速度.拥有许多不同的类函数实例,并行地(使用不同的参数)分叉和执行二进制文件,并使用自己独特的shm文件传递结果.
这个线程安全吗?如果我在一个线程中分叉,除了安全之外,还有什么我需要注意的吗?任何建议或帮助非常感谢!
我希望有人可以解释如何让父母等待所有子进程完成后再继续fork之后.我有清理代码,我想运行,但子进程需要返回才能发生这种情况.
for (int id=0; id<n; id++) {
if (fork()==0) {
// Child
exit(0);
} else {
// Parent
...
}
...
}
Run Code Online (Sandbox Code Playgroud) 我正在写一个C程序中我fork(),exec()和wait().我想把我执行的程序的输出写入文件或缓冲区.
例如,如果我exec ls 我想写入file1 file2 etc缓冲区/文件.我认为没有办法读取标准输出,所以这是否意味着我必须使用管道?这里有一个我无法找到的一般程序吗?
考虑这个简单的代码:
int myvar = 0;
int main() {
if (fork()>0) {
myvar++;
} else {
// father do nothing
}
}
Run Code Online (Sandbox Code Playgroud)
当孩子增加myvar时,值是否与父亲共享(如pthread)?
我正在使用fork()C/C++ 创建子进程.
当父进程结束(或由于某种原因被杀死)时,我也想要杀死所有子进程.
这是由系统自动完成的吗?或者我必须自己做?
谢谢.
预先存在的类似问题: