C 在子进程之前执行父进程,反之亦然
编辑:我修改了问题,使其更清楚。 我想要:C 在子进程之前执行父进程,反之亦然,c,process,fork,child-process,C,Process,Fork,Child Process,编辑:我修改了问题,使其更清楚。 我想要: 父进程修改数组,然后子进程显示更新的数组 或 子进程修改数组,然后父进程显示更新的数组 这是第一个场景的代码。子进程不显示更新的数组,而是显示原始数组 #include <stdio.h> void main(){ int p; int i; int values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; p = fork(); if (p != 0){
#include <stdio.h>
void main(){
int p;
int i;
int values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
p = fork();
if (p != 0){
for (i = 0; i < 10; i++){
values[i] = values[i] * 100;
}
}else{
printf("Updated elements: ");
for (i = 0; i < 10; i++){
printf("%d ", values[i]);
}
}
}
#包括
void main(){
INTP;
int i;
int值[]={1,2,3,4,5,6,7,8,9,10};
p=fork();
如果(p!=0){
对于(i=0;i<10;i++){
数值[i]=数值[i]*100;
}
}否则{
printf(“更新元素:”);
对于(i=0;i<10;i++){
printf(“%d”,值[i]);
}
}
}
使用一个。或者,如果您想要更简单的东西(但以性能为代价),您可以使用int*parentWait=1
并将其传递给子进程。当子进程完成时,它可以将parentWait
的内容更新为0
然后,在家长的过程中,您可以
while(parentWait){
// do nothing.
}
但是要注意,正如所指出的,这种方法需要指针
parentWait
指向一个。因此,我建议您使用POSIX信号量。如果不使用共享内存,您所要求的是不可能的。
当您
fork()
时,子级将获得父级内存(包括数组)的副本。但是,现在有两个不同的数组,两个进程都看不到另一个进程对其副本所做的更改。在父上下文中使用sched\u yield()
syscall,它将在父进程之前先执行子进程。您可以在父进程中使用它:waitpid(p,0,0)代码>
如果您检查所有三个条件而不是使用(p!=0),也会更好,因为fork()调用有三种可能的输出:
至于先执行父进程,这通常不是一个好主意,因为它会创建一个孤立进程。子项必须在父项之前终止。在fork()调用之前,可以在子进程之前执行要执行的代码。如果出于某种原因仍希望先执行父级,则可以在子级中使用此命令:
waitpid(getppid(),0,0)代码>
图书馆:
#包括
#包括
#包括
当然可以。用信号灯,我想建议奥拉夫怎么做。这里是一个信号量的例子:如果我想做相反的事情,即父进程修改数组,然后子进程访问更新的数组,是否仍然需要信号量?如果只是为了测试,只需在子进程或父进程中的fork之后放一个sleep(1)(以第二个运行的为准)@Aleksandrus实际上你描述了一种信号量(这是一个更一般的概念),除了内存不是与fork
@immibis共享之外。他可能在fork()之前设置了共享映射。我使用pthreads,它工作得很好。从未用过叉子。那么,这个解决方案不起作用吗?它不起作用,因为父进程和子进程将有单独的parentWait
变量。子对象将其1设置为0。父母的仍然是1。哦,好吧。我会编辑这个答案。谢谢你让我知道
if ( p == 0 )
// Child Code
else if ( p > 0 )
// Parent Code
else
printf("fork failed");