簡體   English   中英

在Unix系統上創建子進程?

[英]Creating a child process on Unix systems?

我正在嘗試在另一個進程中創建一個子進程。 我正在用C語言編寫這兩個程序。 首先,我編寫一個虛擬進程,它將是子進程。 它只在屏幕上寫一個字符串。 它本身可以很好地工作。 然后,我編寫另一個程序,它將成為父進程。 但是,我無法實現。 我正在嘗試同時使用fork和execl函數,但是失敗了。 我還希望子進程在父進程終止之前不終止。

我應該如何編寫父流程?

謝謝。

這是子進程的代碼:

#include <stdio.h>

int main(void) {
  while(1) {
    printf("*");
    sleep(1);
  }
}

這是父流程:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
  if (fork()) {
    while(1) {
      printf("-\n");
      sleep(5);
    }
  } else {
    execl("./", "dummy", (char *)0);
  }
}

fork()系統調用可能返回三種不同的狀態:失敗(<0),父進程(> 0)或子進程(== 0)。 您必須正確測試返回值。

int pid = fork();

if (pid < 0) {
  /* handle error */
  perror("fork");
  exit(1);
} else if (pid > 0) {
  /* parent code */
} else {
  /* child code */
}

您的execl()系統調用是錯誤的。 第一個參數是要執行的程序的路徑,“ ./”無效,至少應為“ ./dummy”。 根據約定,下一個參數是命令名稱(已執行程序中的argv [0]),該名稱可以是第一個參數的重復。 所以:

execl("./dummy", "dummy", NULL);

另外,請注意,子程序中的printf("*")語句可能會緩沖,並且您在終端上將看不到任何內容。 您必須在末尾添加“ \\ n”或調用fflush(stdout)刷新標准輸出。

C語言中fork的基本用法

int PID = fork();

if( PID < 0 ) {
    //fail
    return PID;
}
else if( !PID ) {
    //child process
    return exec( prog, args );
} 
else {
    //parent process
    return 0;
}

沒有辦法強制子進程完成后“不終止”(您仍然可以在父進程中wait它來獲取有關其終止方式的信息,僅此而已)。 除此之外,網絡上的fork / exec的許多示例中的任何示例(例如示例)都應該起作用-為什么不試試它,看看它是否按預期運行(在這種情況下,您只需要改變自己嘗試做的事情的方式)。 如果無法正常工作(除了本A中第一句話的不可能;-),請編輯,以添加有關代碼行為與預期不同的大量細節。

暫無
暫無

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

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