我不明白为什么Unix有fork()
来创建新进程。在Win32 API中,我们有CreateProcess()
,它创建一个新进程并将可执行文件加载到其地址空间,然后从入口点开始执行。但是Unix提供了用于创建新进程的fork,如果我想运行另一个进程,我不知道为什么要复制我的进程。
那么让我问这两个问题:
fork()
然后exec()
效率更高,为什么没有函数forkexec(const char *newProc)
,因为我们会在exec()
之后几乎每次调用fork()
情况?fork()
存在呢?答案 0 :(得分:11)
fork()
电话就足够了。它也更灵活;它允许您调整子进程中的I / O重定向,而不是使系统调用复杂化以创建进程。使用SUID或SGID程序,它允许子进程在执行其他进程之前失去其提升的权限。
如果您想要一种复杂的方法来创建流程,请查找posix_spawn()
函数。
#include <spawn.h> int posix_spawn(pid_t *restrict pid, const char *restrict path, const posix_spawn_file_actions_t *file_actions, const posix_spawnattr_t *restrict attrp, char *const argv[restrict], char *const envp[restrict]); int posix_spawnp(pid_t *restrict pid, const char *restrict file, const posix_spawn_file_actions_t *file_actions, const posix_spawnattr_t *restrict attrp, char *const argv[restrict], char *const envp[restrict]);
区别在于posix_spawnp()
在PATH上搜索可执行文件。
还有一整套其他函数可用于处理posix_spawn_file_actions_t
和posix_spawnattr_t
类型(请参阅参考手册页底部的“另请参阅”链接)。
这与Windows上的CreateProcess()
非常相似。但是,在大多数情况下,使用fork()
后不久exec()
更简单。
我不明白你的意思。子进程代码将由我编写,那么编写
if (fork() == 0)
并将此代码放在子代main()
的开头有什么区别?
通常,您执行的代码不是由您编写的,因此您无法修改子进程开始时发生的情况。想想一个壳;如果您从shell运行的唯一程序是您编写的程序,那么生活将变得非常贫困。
通常,您执行的代码将从许多不同的地方调用。特别是,考虑一个shell和一个程序,它有时会在管道中执行,有时候会在没有管道的情况下执行。被调用的程序无法分辨它应该做什么I / O重定向和修正;调用程序知道。
如果调用程序以提升的权限(SUID或SGID权限)运行,则在运行其他程序之前想要关闭这些“关闭”是正常的。依靠其他程序知道该做什么是......愚蠢。
答案 1 :(得分:3)
类UNIX操作系统(至少是较新的Linux和BSD内核)通常具有非常高效的 fork
实现 - 它“非常便宜”,有“线程”实现以某些语言为基础。
最后,forkexec
函数是~n - 对于n行应用程序代码的一些小值。
我确定希望Windows有这样一个有用的ForkProcess
:(
快乐的编码。
提到的一个cnicutar,Copy-On-Write (COW)是使用的一种策略。
答案 2 :(得分:0)
有一个功能等同于forkexec - system
http://www.tutorialspoint.com/c_standard_library/c_function_system.htm
#include <stdio.h>
#include <string.h>
int main ()
{
char command[50];
strcpy( command, "ls -l" );
system(command);
return(0);
}