簡體   English   中英

C編程子進程未執行

[英]C programming child process is not executing

因此,這是創建兩個過程的簡單程序:父級和子級。 所以我要做的是在父進程內部有問候語,在子進程內部有名字。 由於某種原因,盡管我在父級內部調用了wait(),但子級進程仍無法打印。 我該怎么辦?

目標輸出:“ Hello Sam”,輸出I“ M GETTING:“ Hello”

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    char *greeting = "Hello";
    char *name;


    pid_t pid;

    pid = fork();

    if(pid == 0)
    {
      name = "Sam";
      exit(0);
    }
    else if(pid == -1)
        printf("Fail\n");
    else{
      wait(0);
     printf("%s %s", greeting, name);
  }

} 

當您調用fork()時,子進程將收到父進程的地址空間(變量等)的副本 這意味着在子級中,從父級定義了“名稱”。 但是,子進程中的“名稱”只是一個副本。 因此,在子進程中對其進行修改不會影響父進程。

要獲得我感覺到的行為,請用vfork()替換fork()。 在此討論中,唯一的區別是:

  1. 地址空間是共享的,而不是復制的。 在子進程中編輯“名稱”將反映在父進程中
  2. 子進程執行時,父進程被掛起。 我認為這是可以的,因為您已經在父進程中調用了wait()

編輯:我忘了補充,如果您走了vfork路線,則在子進程中將exit()更改為_exit()

一旦分叉的子進程將獨立於父進程運行。 因此,當您在子級中set name="Sam" ,它位於與printf不同的程序中。 因此您看不到該消息。

在子進程中,您分配了name ,然后退出。

if(pid == 0)
{
  name = "Sam";
  exit(0);
}

printf("%s %s", greeting, name); 行僅在else分支(即父進程)中執行。 這實際上是未定義的行為,因為name未初始化。

暫無
暫無

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

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