我现在正在学习操作系统课程,并且刚刚介绍了“fork”,“execv”对。
至于我现在的理解,fork用于创建进程的抽象,而execv用于使该进程执行一些实际的工作。
我的直觉告诉我,这并不是那么简单,只有在没有“execv”的情况下使用“fork”才有一些实际用途。 你能为我做一个例子吗?
答案 0 :(得分:1)
乍一看,让子进程与其父进程完全相同似乎没用。但是考虑到你可以使用if语句分离它的行为,可以想象使用fork()本身
如您所知,fork()创建了一个新进程。新进程是原始(父)进程的副本,具有相同的代码和相同的程序计数器,但PCB自然不同。
现在让我们看一下您正在寻找的示例。在许多情况下,我们可能需要进行多处理。在此代码中,我们创建了特定数量的流程来为我们做一些工作。
#include<stdio.h>
#include<sys/types.h>
#define PROCESS_NOM 5
int main()
{
pid_t pid; //Or int pid
int i;
for(i = 0; i < PROCESS_NOM; i++)
{
pid = fork();
if(pid == -1)
printf("Error!\n");
else if(pid == 0)
{
//Child process code
//Maybe manipulation data with parent using IPC
//Of course you can call other functions here to execute in child process.
exit(0);
}
//Since we have used exit() function inside if scope, other parts of main function will execute only for parent process.
}
}
Fork将新(子)进程的进程ID返回给父进程。所以在父进程中,pid得到一个正值。同时在子进程中,有一个pid变量没有任何内容,因为它们没有调用fork()并将赋值为零。
最后,让我补充一点。还有其他&#34; exec家庭&#34;系统调用:execl(),execlp等。所有这些函数都用新的过程映像替换当前过程映像(内存空间)。