簡體   English   中英

在子進程之前執行父進程,反之亦然

[英]Execute parent process before child process or vice versa

編輯:我已經修改了問題,使其更清楚。

我想要:

  1. 父進程修改數組,然后子進程顯示更新的數組。

要么

  1. 子進程修改數組,然后父進程顯示更新的數組。

這是第一種情況的代碼。 子進程不顯示更新的數組,而是原始數組。

#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]);
        }
    }
}

使用信號量 或者,如果您想要更簡單的方法(但以性能為代價),則可以將int* parentWait = 1; 並將其傳遞給子進程。 子級完成此過程后,可以將parentWait的內容更新為0​​。

然后,在父母的過程中,

while(parentWait){
  // do nothing.
}

雖然小心,正如指出的CTX ,這種方法需要的是指針parentWait是指向一個共享的地圖 因此,我建議您使用POSIX信號燈。

不使用共享內存就無法實現您所要求的。 當您fork() ,子級將獲得父級內存(包括數組)的副本。 但是,現在有兩個不同的數組,兩個進程都看不到對方對其副本所做的更改。

在派生之后在父上下文中使用sched _yield() syscall,它將在父進程之前先執行子進程

您可以在父級中使用它: waitpid(p, 0, 0);

如果檢查所有三個條件而不是使用(p!= 0),也會更好,因為fork()調用有三個可能的輸出:

if ( p == 0 )  
// Child Code  
else if ( p > 0 )  
// Parent Code  
else  
   printf("fork failed");  

至於先執行父進程,通常不是一個好主意,因為它會創建一個孤立的進程。 孩子必須在父母之前終止。 您可以在fork()調用之前的子進程之前執行要執行的代碼。 如果由於某種原因仍要先執行父級,則可以在子級中使用它:
waitpid(getppid(), 0, 0);
庫:
#include <sys/types.h>
#include <unistd.h>
#include<sys/wait.h>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM