标签: fork

在linux gcc中使用fork()

fork() 创建一个新进程,子进程从父进程的当前状态开始执行.

这是我fork()在Linux中所知道的.

所以,相应的代码如下:

int main() {
  printf("Hi");
  fork();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

需要按照上述方式仅打印一次"Hi".

但是在使用gcc编译的Linux中执行上述操作时,它会打印两次 "Hi" .

有人可以向我解释实际使用中发生了什么,fork()以及我是否理解了fork()正确的工作?

c linux gcc fork

26
推荐指数
3
解决办法
1万
查看次数

如何在gdb中的fork()之后调试子进程?

调用fork后,当前进程将调用exit(0).

但孩子会继续.

switch(fork())
{
  case -1:
    exit(1);
  case 0:
    //child process,continue
    break;
  default:
    //the current process,exit
    exit(0);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如何继续调试子进程?

c gdb fork

26
推荐指数
1
解决办法
2万
查看次数

用自己的fork交换git子模块

我在我的git repo中添加了一个子模块,如下所示:

$ git submodule add git://github.com/user/some-library some-library
Run Code Online (Sandbox Code Playgroud)

我已经决定要创建一个库的分叉来做一些调整.我如何交换该子模块,以便它指向我自己的github fork呢?

git fork github git-submodules

26
推荐指数
2
解决办法
1万
查看次数

使用Python 3.6.1在Linux/Intel Xeon上使用"fork"上下文块进行多处理?

问题描述
我稍微调整了这个答案的代码(见下文).但是,当在Linux上运行此脚本时(所以命令行:) python script_name.py,它将打印jobs running: x所有作业,但之后似乎只是卡住了.但是,当我使用spawn方法(mp.set_start_method('spawn'))时,它运行正常,并立即开始打印counter变量的值(请参阅listener方法).


  • 为什么它仅在产生过程时才起作用?
  • 如何调整代码以便它可以使用fork?(因为它可能更快)

import io
import csv
import multiprocessing as mp

NEWLINE = '\n'

def file_searcher(file_path):
    parsed_file = csv.DictReader(io.open(file_path, 'r', encoding='utf-8'), delimiter='\t')

    manager = mp.Manager()
    q = manager.Queue()
    pool = mp.Pool(mp.cpu_count())

    # put listener to work first
    watcher = pool.apply_async(listener, (q,))

    jobs = []
    for row in parsed_file:
        print('jobs running: ' + str(len(jobs) + 1))
        job = pool.apply_async(worker, (row, q)) …
Run Code Online (Sandbox Code Playgroud)

python linux fork multiprocessing python-3.x

25
推荐指数
1
解决办法
995
查看次数

从分叉进程返回数据

如果我做

Process.fork do 
  x 
end 
Run Code Online (Sandbox Code Playgroud)

我怎么知道x返回了什么(例如true/fase/string)?

(写入文件/数据库不是一种选择......)

ruby fork process

24
推荐指数
3
解决办法
1万
查看次数

Maven surefire插件fork模式

默认情况下,maven surefile插件在隔离(分叉)环境中运行测试.您可以使用以下配置覆盖此行为:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <forkMode>never</forkMode>
      </configuration>
    </plugin>
  </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

如果需要调试测试,则应使用此配置代码段.或者您可以通过以下方式简单地运行maven:

$ mvn -Dmaven.surefire.debug tests
Run Code Online (Sandbox Code Playgroud)

这将启动端口5005上的调试器.

我的问题是:分支策略有哪些好处?为什么选择maven构建的默认策略?非福祉策略是不是更直接,因此应该用作默认值(maven是约定优于配置工具,对吧)?

maven-2 fork surefire

24
推荐指数
1
解决办法
3万
查看次数

fork()时是否共享文件描述符?

假设我打开一个文件open().那我是fork()我的节目.

父和子现在会共享文件描述符的相同偏移量吗?

我的意思是如果我在父亲那里写作,那么儿童的偏移量也会改变吗?

或者补偿是否会在fork()?之后独立?

c unix linux fork

24
推荐指数
2
解决办法
1万
查看次数

linux fork:防止文件描述符继承

你如何阻止文件描述符跨fork()系统调用继承(当然没有关闭它)?

我正在寻找一种方法来将单个文件描述符标记 为不被(copy)在fork()中继承,类似于FD_CLOEXEC类似的hack但是for forks(如果你愿意,那么就是FD_DONTINHERIT功能).有人这样做过吗?或者看看这个,并提示我开始?

谢谢

更新:

我可以使用libc的__register_atfork

 __register_atfork(NULL, NULL, fdcleaner, NULL)
Run Code Online (Sandbox Code Playgroud)

在fork()返回之前关闭子中的fds.然而,fds仍然被复制,所以这对我来说听起来像是一个愚蠢的黑客.问题是如何跳过不需要的fds的孩子中的dup()

我想到了一些需要fcntl(fd,F_SETFL,F_DONTINHERIT)的场景:

  • fork()将复制事件fd(例如epoll); 有时这不是必需的,例如FreeBSD将kqueue()事件fd标记为KQUEUE_TYPE,并且这些类型的fds不会被复制到forks(如果有人想要,则会明确跳过kqueue fds被复制)从一个孩子使用它必须与共享fd表分叉)

  • fork()将复制100k不需要的fds来分叉一个孩子做一些cpu密集型任务(假设需要fork()概率非常低,程序员不希望维护一个孩子池,因为通常不会发生)

我们想要复制一些描述符(0,1,2),有些(大多数?)不是.我认为完整的fdtable重复是出于历史原因,但我可能错了.

这听起来多么愚蠢:

  • 修补fcntl以支持文件描述符上的dontinherit标志(不确定标志是应该保持per-fd还是保存在fdtable fd_set中,就像保持close-on-exec标志一样
  • 修改内核中的dup_fd()以跳过dontinherit fds的复制,就像freebsd 对kq fds一样

考虑该计划

#include <stdio.h>
#include <unistd.h>
#include <err.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>

static int fds[NUMFDS];
clock_t t1;

static void cleanup(int i)
{
    while(i-- >= 0) close(fds[i]);
}
void clk_start(void)
{
    t1 = clock();
}
void clk_end(void)
{  

    double tix = (double)clock() …
Run Code Online (Sandbox Code Playgroud)

linux fork

24
推荐指数
3
解决办法
2万
查看次数

如何通过父进程杀死子进程?

我使用a创建子进程fork().如果子进程无法在30秒内完成执行,父进程如何杀死子进程?我想允许子进程执行长达30秒.如果超过30秒,父进程将终止它.你有任何想法吗?

c fork kill

24
推荐指数
2
解决办法
15万
查看次数

WEXITSTATUS(状态)返回什么?

我试图了解它是如何WEXITSTATUS(status)工作的.我遇到了一段代码,其中返回值WEXITSTATUS(status)被添加到变量中.

这是片段:

waitpid(-1, &status, 0);
counter += WEXITSTATUS(status);
Run Code Online (Sandbox Code Playgroud)

如何WEXITSTATUS计算返回值?

c unix posix fork signals

24
推荐指数
1
解决办法
8万
查看次数

标签 统计

fork ×10

c ×5

linux ×4

unix ×2

gcc ×1

gdb ×1

git ×1

git-submodules ×1

github ×1

kill ×1

maven-2 ×1

multiprocessing ×1

posix ×1

process ×1

python ×1

python-3.x ×1

ruby ×1

signals ×1

surefire ×1