相关疑难解决方法(0)

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万
查看次数

如何正确使用fork()和exec()

我有这个代码;

pid_t process;
process = fork();

if (process < 0){
   //fork error
   perror("fork");
   exit(EXIT_FAILURE);
}
if (process == 0){
   //i try here the execl
   execl ("process.c", "process" , n, NULL);
}
else {
   wait(NULL);
}
Run Code Online (Sandbox Code Playgroud)

我不知道这种使用fork()exec()组合是否正确.当我尝试从bash运行程序时,我没有收到任何结果,所以我认为这部分代码可能存在问题.
谢谢.

c fork process exec

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

C程序中的fork vs vfork功能

我正在做一些自我学习的C练习,并遇到了以下问题:

第一部分:

int main(int argc, char **argv) {                                         

    int a = 5, b = 8;                                                     
    int v;                                                                

    v = fork();                                                           
    if(v == 0) {                                                          
        // 10                                                             
        a = a + 5;                                                        
        // 10                                                             
        b = b + 2;                                                        
        exit(0);                                                          
    }                                                                     
    // Parent code                                                        
    wait(NULL);                                                           
    printf("Value of v is %d.\n", v); // line a                           
    printf("Sum is %d.\n", a + b); // line b                              
    exit(0);                                                              

} 
Run Code Online (Sandbox Code Playgroud)

b部分:

int main(int argc, char **argv) {                                         

    int a = 5, b = 8;                                                     
    int v; …
Run Code Online (Sandbox Code Playgroud)

c fork vfork

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

标签 统计

fork ×3

c ×2

exec ×2

process ×2

clone ×1

linux ×1

vfork ×1