我知道fork()对于子进程和父进程返回的结果有所不同,但是我无法找到有关此情况的信息。子进程如何从fork接收返回值0?在调用堆栈方面有什么区别?据我了解,对于父母来说,是这样的:
父进程-调用fork-> system_call-调用fork-> fork执行-返回-> system_call-返回->父进程。
在子进程中会发生什么?
%人叉
返回值
Upon successful completion, fork() returns a value of 0 to the child process and returns the process ID of the child process to the parent process. Otherwise, a value of -1 is returned to the parent process, no child process is created, and the global variable [errno][1] is set to
indi-
cate the error.
发生的事情是在fork系统调用中,整个过程重复了。然后,每个调用中的fork调用都会返回。但是,这些现在是不同的上下文,因此它们可以返回不同的返回码。
如果您真的想知道它的工作原理,可以随时检查源代码!如果您不习惯阅读内核代码,则代码会有些混乱,但是内联注释可以很好地提示正在发生的事情。
源代码中最有趣的部分是您的问题的明确答案,它位于fork()定义本身的末尾-
if (error == 0) {
td->td_retval[0] = p2->p_pid;
td->td_retval[1] = 0;
}
“
td”显然拥有一个不同线程的返回值列表。我不确定这种机制的工作原理(为什么没有两个单独的“线程”结构)。如果错误(从fork1返回,“真实”派生函数返回)为0(无错误),则采用“第一个”(父)线程并将其返回值设置为p2(新进程)的PID。如果它是“第二个”线程(在p2中),则将返回值设置为0。
我必须分叉两个子进程,其中SIGINT命令被阻塞,但其中一个在接收到SIGTERM信号时应该解除阻塞,而另一个子进程和父进程都会打印它们的PID,作为相同SIGTERM信号的结果。第二个子进程应立即终止,但父进程应等待其子进程结束,然后停止。 我刚开始在Linux中学习C编程,但我并不真正理解分叉和信号是如何工作的。据我所知,我编写的这段代码将派生一个进程,子进程将阻止Ctrl-C命令,整个过程将
从父进程派生出子进程,子进程完全拷贝父进程的stack,data,heap segment。 两者并不共享地址空间,所以的变量是独立的,一方修改,另一方不会变化。 函数原型 #include <unistd.h> pid_t fork(void); 特点 一次调用,两次返回
问题内容: 我分叉了多个流程,我想衡量完成整个任务需要多长时间,即所有分叉的流程都完成了。请告知如何使父进程等待所有子进程终止?我想确保在正确的时间停止计时器。 这是我使用的代码: 问题答案: 我将在“ else // parent”行之后的所有内容都移到for循环之外。在分叉循环之后,使用waitpid进行另一个for循环,然后停止计时并执行其余操作: 我假设如果子进程无法正常退出且状态为0,则
父进程定时器回调函数中fork,子进程execl,子进程无法接收到SIGALRM信号 父进程代码 子进程代码 子进程一直pause,通过命令行kill发送SIGALRM信号,STRACE监控,子进程没有接收到信号
问题内容: 我想在C 中使用 fork() 创建流程的副本。我不知道如何将参数传递给流程的副本。例如,我想将整数传递给流程副本。 或者我该怎么办,如果我有一个循环,我在其中调用fork()并想将唯一的值传递给进程(例如0 … N) 问题答案: 有趣的是,您产生的每个进程都会自动获取父进程拥有的所有内容的副本,因此,例如,我们想将int传递给两个子进程中的每个,但我希望每个进程都具有与父进程不同的值
问题内容: 是否可以从Shell脚本中的父进程ID获取子进程ID? 我有一个要使用Shell脚本执行的文件,这会导致一个新进程 process1 (父进程)。这个 过程1 已经分叉的另一个进程 过程2 (子进程)。使用脚本,我可以使用以下命令获取 process1 的pid : 但我无法获取子进程的pid。 问题答案: 只需使用: