由于C中的函数一直只返回一个值,fork()
(也是一个函数)如何返回两个值?
答案 0 :(得分:19)
fork函数将0返回给已创建的子进程,并将子ID发送给父进程。
两个单独的进程都返回一个值。
因此,在每个线程进程上调用一个返回值时,请更多地考虑它。
答案 1 :(得分:13)
正如 Gnostus 所说,fork()函数不会返回两个值。
它的作用是返回一个值,就像所有函数一样,但它会返回两次。
进入父进程并进入子进程内。父进程获取返回给它的子进程ID,子进程为0 - 进程ID无效,因此代码可以告诉它是子进程。
子进程是一个新进程,运行相同的代码,并且与生成它的父进程位于代码中的相同位置。
int cProcessID;
cProcessID = fork();
if (cProcessID == 0) {
// Child process
} else {
// Parent process
}
答案 2 :(得分:9)
如果您阅读,构建并运行以下程序,您应该更好地了解正在发生的事情。
#include <stdio.h>
#include <unistd.h>
int main(void) {
pid_t fk;
printf("\tbefore fork my pid = %lu\n", (unsigned long)getpid() );
fflush(stdout); /* This may keep the above print
statement from outputing twice. */
fk = fork(); /* The OS kernel makes a copy of the current process here */
printf("fork returned %lu and now my pid = %lu\n",
(unsigned long)fk, (unsigned long)getpid() );
return 0;
}
需要fflush(stdout)
的原因是,因为fork会复制该进程,这意味着stdio对stdout的缓冲也是重复的。第一个print语句末尾的“\ n”可以使它继续并刷新stdout,但这不能保证。
答案 3 :(得分:8)
这里的主要观点是考虑一个事实,即fork()
之后你的程序真的两个副本。这是两个进程,运行代码的完全相同的副本,执行指针正好在同一行代码,即fork()
,准备返回。
操作系统安排fork()
在父进程中返回子进程的pid,并在子进程中返回0(如果运行顺利)。
这就是他们说fork()
两次返回的原因。一旦进入每个过程。
答案 4 :(得分:5)
fork
不会返回两个值。在fork
系统调用之后,您只需要两个独立的进程执行相同的代码,而fork
返回的pid是区分您所在的进程的唯一方法 - 父进程或子进程。 / p>