[英]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.