簡體   English   中英

在父進程和子進程之間進行Fork()切換

[英]Fork() switch between Parent and Child processes

我有一個創建2個子進程的程序。 客戶端進程將其PID發送到服務器進程,服務器進程將隨機ID發送回客戶端進程,最后,客戶端進程接收ID並將其打印出來。

我的代碼中的問題是我無法正確獲得執行順序。 我可以做一個Client-Client-Server或Server-Client-Client通信。 如何強制程序以正確的順序執行?

我正在嘗試模擬此客戶端-服務器通信,以便以后將其擴展到與單個服務器通信的多個客戶端,因此原始流程不應包含在解決方案中。

謝謝你的幫助。

電流輸出:

客戶端(2971):從服務器檢索到新的ID 32767。

服務器(2972):從客戶端檢索到pid 2971。 正在發送新的ID。

預期產量:

服務器(2972):從客戶端檢索到pid 2971。 正在發送新的ID。

客戶端(2971):從服務器檢索到新的ID 32767。

int main (int argc, char *argv[])
{
   int petitionPipe[2];
   int responsePipe[2];

if (pipe(petitionPipe) != 0 || pipe(responsePipe) != 0)
{
    err_exit("Failed to open a pipe\n");
}

int client = fork();
int server = 0;

if (client > 0)
{
    server = fork();
}

if (client < 0 || server < 0)
{
    err_exit("fork() failed\n");
}

else if (client == 0)
{
    clientPetition(petitionPipe, responsePipe);
}

else if (server == 0)
{
    serverResponse(petitionPipe, responsePipe);
}

if (client == 0)
{
    clientResult(petitionPipe, responsePipe);
}

return 0;


static void clientPetition(int *petitionPipe, int *responsePipe)
 {
    pid_t pid;

    close(petitionPipe[READ]);
    close(responsePipe[WRITE]);
    close(responsePipe[READ]);

    pid = getpid();

    write(petitionPipe[WRITE], &pid, sizeof(pid_t));
 }

static void serverResponse(int *petitionPipe, int *responsePipe)
 {
    pid_t pid;
    int newID;

    close(petitionPipe[WRITE]);
    close(responsePipe[READ]);

    read(petitionPipe[READ], &pid, sizeof(pid));

    printf("Server(%d): Recived pid %d from client. Sending new ID.\n\n", getpid(), pid);

    srand(pid);
    newID = rand() % 100;

    write(responsePipe[WRITE], &newID, sizeof(newID));
 }

static void clientResult(int *petitionPipe, int *responsePipe)
{
    int newID;

    close(petitionPipe[READ]);
    close(petitionPipe[WRITE]);
    close(responsePipe[WRITE]);

    read(responsePipe[READ], &newID, sizeof(newID));

    printf("Client(%d): Recieved new ID %d from Server.\n\n", getpid(), newID);
}

盡管我尚未運行您的代碼,但是您的代碼中有3個進程。

  Main process
  |         |
  |         |
  v         v
Server    Child

經驗法則:即使您確定子進程在父進程之前結束,也不要忘記執行埋葬程序。 通過調用wait(...)您告訴操作系統我已經為孩子完成了工作,因此現在您可以清理分配的字段等。

因此,您必須先等待兩個孩子,然后再讓主流程返回。 如果沒有機會開始執行服務器進程或客戶端進程怎么辦? 僵屍? 孤兒??

AFAIS,如果我們忽略上述情況,我認為您的程序可以按預期運行。 不按順序打印並不表示它工作不正常。 您無法代表OS決定先運行哪個進程,等等,除非您可以分別通過關鍵部分或中斷概念(如信號量或信號發送)​​將感覺敲入。

暫無
暫無

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

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