我不明白管道在 UNIX 中是如何作業的,我做了這段代碼,但偶然發現了一個奇怪的事實。練習的痕跡可以在代碼的頂部找到。我會解釋我無法得到的東西。在父行程中,當我想從管道中列印值時,“i”變數開始處的值可以是任何數字。我輸入了“4”,但它適用于每個數字 2、3 、4 excetera。怎么每次都能用?
/*****************************************************************
The candidate should complete the program provided, implementing
the main.
The program creates a child process; the child process reads
from the keyboard an integer N >= 0, and transmits the values N, N-1, N-2, N-3, ..., 0
(inclusive) to the parent process via a pipe.
The father process reads from the pipe the values transmitted by the child process
and prints them, until it receives the value 0; then the father process
process waits for the termination of the child process and terminates.
Example:
I am the child process. Enter a number >=0: 4
I am the father process. I have received: 4
I am the father process. I have received: 3
I am the father process. I have received: 2
I am the father process. I have received: 1
I am the father process. I have received: 0
I am the father process. The son has finished.
******************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
int fd[2];
int num, i;
//Pipe creation
if(pipe(fd)<0)
{
printf("Pipe creation failed\n");
return 1;
}
//Creating a child process
pid_t pid=fork();
//Fork check
if(pid<0)
{
printf("Fork failed\n");
return 1;
}
//Entering the child process
else if(pid==0){
close (fd[0]); // Not interested in reading
printf("I am the child process\n");
//Acquiring a number from input
printf("Give me a number: ");
scanf("%d", &num);
//Sending the numbers trough a pipe
for(i=num; i>=0; i--)
{
int sent=write(fd[1], &i, sizeof(num));
//Check on the number of bytes the function wrote
if(sent<0 || sent<sizeof(num))
{
printf("Error when sending\n");
return 1;
}
}
close (fd[1]);
return 0;
}
//Entering the father process
if(pid>0)
{
//Father process
wait(NULL);
close (fd[1]);// Not interested in writing
for(i=4;i>=0;i--)//4 is a random number and it still works
{
int ricevuti=read(fd[0], &i, sizeof(num));
//Check on the number of bytes the function read
if(ricevuti<0 || ricevuti<(sizeof(num)))
{
printf("Error when receiving\n");
return 1;
}
//Printing the values read by the function
else
{
printf("I am the father process and i received: %d\n", i);
}
}
printf("The child process has terminated\n");
}
close (fd[0]);
return 0;
}
uj5u.com熱心網友回復:
它適用于任何數字的原因是因為您正在從管道讀取回圈使用的迭代變數for。因此,即使您從 開始i = 4,第一個read(fd[0], &i, sizeof(num))也會更改i為孩子發送的起始編號。
你應該讀入num,而不是i。父親代碼應該是:
//Entering the father process
if(pid>0)
{
//Father process
wait(NULL);
close (fd[1]);// Not interested in writing
for(i=4;i>=0;i--)//4 is a random number and it still works
{
int ricevuti=read(fd[0], &num, sizeof(num));
//Check on the number of bytes the function read
if(ricevuti<0 || ricevuti<(sizeof(num)))
{
printf("Error when receiving\n");
return 1;
}
//Printing the values read by the function
else
{
printf("I am the father process and i received: %d\n", num);
}
}
printf("The child process has terminated\n");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/340178.html
