小编use*_*033的帖子

fork(),vfork(),exec()和clone()之间的区别

我希望在Google上找到这四者之间的差异,我希望有关于此的大量信息,但四个电话之间确实没有任何可靠的比较.

我开始尝试编译一种基本的一目了然的看看这些系统调用之间的差异,这就是我得到的.所有这些信息是否正确/我错过了什么重要的事情?

Fork :fork调用基本上复制了当前进程,几乎在所有方面都是相同的(并非所有内容都被复制,例如,某些实现中的资源限制,但想法是尽可能创建尽可能接近的副本).

新进程(子进程)获取不同的进程ID(PID),并将旧进程(父进程)的PID作为其父PID(PPID).因为这两个进程现在运行的代码完全相同,所以它们可以通过fork的返回代码告诉哪个进程 - 子进程为0,父进程获取子进程的PID.当然,这就是假设fork调用有效 - 如果没有,则不创建子节点并且父节点获取错误代码.

Vfork:vfork和fork之间的基本区别在于,当使用vfork()创建新进程时,父进程将暂时挂起,子进程可能会借用父进程的地址空间.这种奇怪的状态一直持续到子进程退出或调用execve(),此时父进程继续.

这意味着vfork()的子进程必须小心,以避免意外修改父进程的变量.特别是,子进程不能从包含vfork()调用的函数返回,并且它不能调用exit()(如果需要退出,它应该使用_exit();实际上,对于子进程也是如此正常的fork()).

Exec :exec调用是一种基本上用新程序替换整个当前进程的方法.它将程序加载到当前进程空间并从入口点运行它.exec()用函数指向的可执行文件替换当前进程.除非存在exec()错误,否则控件永远不会返回到原始程序.

Clone :克隆,作为fork,创建一个新进程.与fork不同,这些调用允许子进程与调用进程共享其执行上下文的一部分,例如内存空间,文件描述符表和信号处理程序表.

使用clone创建子进程时,它将执行函数应用程序fn(arg).(这与fork不同,fork从原始fork调用开始继续执行.)fn参数是指向子进程在执行开始时调用的函数的指针.arg参数传递给fn函数.

当fn(arg)函数应用程序返回时,子进程终止.fn返回的整数是子进程的退出代码.子进程也可以通过调用exit(2)或在收到致命信号后明确终止.

获得的信息形式:

感谢您抽时间阅读 !:)

linux fork clone process exec

190
推荐指数
4
解决办法
14万
查看次数

从Java中的字符串中提取第一个单词的最佳方法是什么?

尝试编写一个简短的方法,以便我可以解析一个字符串并提取第一个单词.我一直在寻找最好的方法来做到这一点.

我假设我会使用str.split(","),但是我想从字符串中抓取第一个第一个单词,并将其保存在一个变量中,并将其余的标记放在另一个变量中.

这样做有简洁的方法吗?

java string

54
推荐指数
6
解决办法
14万
查看次数

什么是linux进程表?它由什么组成?

这个术语一直出现在我的操作系统说明中,我不完全确定它是什么/它存储的位置以及方式或原因.

linux process

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

ArrayList警告 - 警告:[未选中]未经检查的调用添加(E),也不会运行文件

我一直在努力让这段代码适合现阶段的感觉.它是为了计算一个范围内的素数,我写了一个方法来打印它们.不幸的是,代码不会编译,引用警告:

"warning:[unchecked] unchecked调用添加(E)作为原始类型java.util.List的成员"

- 我从谷歌搜索中了解到这个警告是因为没有声明你的erray中应该包含哪些类型的值,但是我已经这样做了,当我尝试在我的上使用.add()函数时,似乎只出现了错误.数组列表.

当我尝试运行它时,它给出了一个更可怕的错误"静态错误:未定义的名称'PrimeNumbers'

我想我在这一点上已经失去了密码,尽管有几次尝试都无法找出我做错了什么.

import java.util.*;

public class PrimeNumbers { 

    private List listOfPrimeNumbers;  //add a member variable for the ArrayList
    public static void main(String args []){    
      PrimeNumbers primeNumberList = new PrimeNumbers(50);
      primeNumberList.print();  //use our new print method
    }

public PrimeNumbers (int initialCapacity) {
    listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity/2);  //initialCapacity/2 is an easy (if not tight) upper bound
    long numberOfPrimes = 0; //Initialises variable numberOfPrimes to 0
    int start = 2;
    boolean[] isPrimeNumber = new boolean[initialCapacity + 1];

    for …
Run Code Online (Sandbox Code Playgroud)

java

16
推荐指数
1
解决办法
4万
查看次数

有人可以解释这个实现如何工作?还有,它会变得更好吗?怎么样?

public class Main { 
    public static void main(String args []){ 
        long numberOfPrimes = 0; //Initialises variable numberOfPrimes to 0 (same for all other variables)
        int number = 1; 
        int maxLimit = 10000000; 
        boolean[] sieve = new boolean[maxLimit]; //creates new boolean array called sieve and allocates space on the
                                                //stack for this array which has maxLimit spaces in it 
        for ( int i = 2; i < maxLimit; i++ ) { //for statement cycling from 2 to 10000000, does not execute …
Run Code Online (Sandbox Code Playgroud)

java algorithm

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

我真的不明白我的讲师在这里得到了什么 - 关于用Java计算素数的讲义

存在用于计算素数的朴素算法.例如,您可以使用while循环来检查所有正整数i的c%i!= 0,使得i> 1且i <c.

然而,不难看出更好的方法是确保所有素数p的c%p!= 0,使得p <c.使用ArrayList中的素数这很容易.请再次注意,这表明您使用while循环.

我试图实现这两种方法,当我得到第一个,检查c%i!= 0时,我不明白第二条信息说更好的算法是使用c%p! = 0.这不意味着我必须知道计算素数的所有素数吗?

我现在所拥有的内容如下:

  public static void isPrime(int candidateNo) {
while (i <= candidateNo/2) {
  if (candidateNo%i==0 && i!=1) {
    return false;
  }
  else
    return true;
}
Run Code Online (Sandbox Code Playgroud)

}

哪个有效,但效率低下.我正在使用该函数创建素数的arraylist(如果函数返回true,则将数字添加到arraylist中).

java primes arraylist

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

寻址32个字节需要多少位?

对不起,这是一个非常愚蠢的问题,只是查看我的操作系统课程的旧试卷,并注意到这个问题可以经常出现.如何解决这个问题?我真的不明白.

另一个问题是:

可以用7位,9位和10位表示的最大和最小无符号整数是多少?

有人能告诉我你将如何解决这个问题吗?它只是2 ^ 7吗?

非常感谢 !:)

byte bits unsigned-integer

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

有人可以解释这个递归代码如何反转java中的int工作吗?

private static int reverse(int n, int r) {
  if (n == 0) return r;
  return reverse(n/10, 10*r+n%10);
}
public static int reverse(int n) {
 return reverse(n, 0);
}
Run Code Online (Sandbox Code Playgroud)

我已经测试了这个并且它有效,我只是无法弄清楚如何.我知道这个数字被除以10然后再次进入循环,但似乎直到n变为小数<1,r根本就没有被使用.救命 ?

java recursion

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

在Java中调用new时,是否会创建构造函数或类的副本?

我目前正在从事Java任务,由于某种原因,它可以工作 - 但在我看来,它不应该!我所拥有的是一个主要方法,通过调用创建三个新按钮

panel.add(new ButtonApp());
Run Code Online (Sandbox Code Playgroud)

ButtonApp是我的ButtonApp类中定义的构造函数.

在我的课程开始时,我有一个声明如下的变量:

public int clicks = 0;
Run Code Online (Sandbox Code Playgroud)

此变量的目的是跟踪用户单击其特定ButtonApp的次数.每次点击后都会调用点击++.

现在,在我看来,每次单击按钮时,点击变量shoudl都会增加,因此,如果单击左键,它也会增加中间和右侧按钮.

基本上我所拥有的快速短伪代码是:

public class ButtonApp() {
    public int clicks =0;

    public static void main(String[] args) {
        //create JPanel/Frame etc etc
        panel.add(new ButtonApp());
        panel.add(new ButtonApp());
        panel.add(new ButtonApp());
    }

    public ButtonApp(){
        //creates a new button
        this.actionListener(this);
    }

    public void update(){
        clicks++;
    }

    public void actionPerformed (ActionEvent event){
        update();
    }
}
Run Code Online (Sandbox Code Playgroud)

我不总是clicks在这里增加一个变量吗?

java class object

2
推荐指数
2
解决办法
285
查看次数

curses中的halfdelay功能有什么作用?

我试图理解以下C程序:

#include <curses.h> 

int main() {
    int i; 
    initscr(); 
    halfdelay(5);
    for (i=0; i < 5; i++) 
        getch(); 
    endwin();
}
Run Code Online (Sandbox Code Playgroud)

但我无法理解它.我理解initscr()初始化当前屏幕,那getch()就是等待用户输入解锁当前终端,但循环和halfdelay()完成是什么?

c curses

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

标签 统计

java ×6

linux ×2

process ×2

algorithm ×1

arraylist ×1

bits ×1

byte ×1

c ×1

class ×1

clone ×1

curses ×1

exec ×1

fork ×1

object ×1

primes ×1

recursion ×1

string ×1

unsigned-integer ×1