Cách sử dụng hàm pipe trong ngôn ngữ C

How Use Pipe Function C Language



Một đường ống là một phương tiện để liên lạc giữa các quá trình. Một quá trình ghi dữ liệu vào đường ống và một quá trình khác đọc dữ liệu từ đường ống. Trong bài này, chúng ta sẽ xem cách sử dụng hàm pipe () để triển khai khái niệm bằng ngôn ngữ C.

Giới thiệu về ống

Trong đường ống, dữ liệu được duy trì theo thứ tự FIFO, có nghĩa là ghi dữ liệu vào một đầu của đường ống một cách tuần tự và đọc dữ liệu từ một đầu khác của đường ống theo cùng một thứ tự tuần tự.







Nếu bất kỳ quá trình nào đọc từ đường ống dẫn, nhưng không có quá trình nào khác chưa được ghi vào đường ống, thì quá trình đọc trả về phần cuối của tệp. Nếu một quá trình muốn ghi vào một đường ống, nhưng không có quá trình nào khác được gắn vào đường ống để đọc, thì đây là một điều kiện lỗi và đường ống tạo ra tín hiệu SIGPIPE.



Tập tin tiêu đề

#bao gồm

Cú pháp



NSđường ống(NSnộp đơn[2])

Tranh luận

Hàm này nhận một đối số duy nhất, một mảng gồm hai số nguyên ( nộp đơn ). đã nộp [0] được sử dụng để đọc từ đường ống, và đã nộp [1] được sử dụng để ghi vào đường ống. Quá trình muốn đọc từ đường ống phải đóng đã nộp [1], và quá trình muốn ghi vào đường ống phải đóng đã nộp [0] . Nếu các đầu không cần thiết của đường ống không được đóng một cách rõ ràng, thì phần cuối của tệp (EOF) sẽ không bao giờ được trả lại.





Trả lại giá trị

Về thành công, đường ống() trả về 0, nếu thất bại, hàm trả về -1.

Về cơ bản, chúng tôi có thể đại diện cho đường ống() chức năng như sau:



Dưới đây là một vài ví dụ mô tả cách sử dụng hàm pipe trong ngôn ngữ C.

Ví dụ 1

Trong ví dụ này, chúng ta sẽ xem cách hoạt động của hàm pipe. Mặc dù việc sử dụng một đường ống trong một quy trình đơn lẻ không hữu ích lắm, nhưng chúng ta sẽ có một ý tưởng.

// Ví dụ1.c
#bao gồm
#bao gồm
#bao gồm
#bao gồm

NSchủ chốt()
{
NSn;
NSnộp đơn[2];
charđệm[1025];
char *thông điệp= 'Chào thế giới!';

đường ống(nộp đơn);
viết(nộp đơn[1],thông điệp, strlen (thông điệp));

nếu như ((n=đọc(nộp đơn[0],đệm, 1024 ) ) > = 0) {
đệm[n] = 0; // kết thúc chuỗi
printf ('đọc% d byte từ ống dẫn:'%NS' ',n,đệm);
}
khác
kẻ gian tà ('đọc');
lối ra (0);
}

Ở đây, lần đầu tiên chúng tôi đã tạo một đường ống bằng cách sử dụng đường ống() sau đó hàm được ghi vào đường ống bằng cách sử dụng ngà voi [1] kết thúc. Sau đó, dữ liệu đã được đọc bằng cách sử dụng đầu kia của đường ống, đó là đã nộp [0] . Để đọc và ghi vào tệp, chúng tôi đã từng đọc() viết() chức năng.

Ví dụ2

Trong ví dụ này, chúng ta sẽ thấy cách các quy trình cha và con giao tiếp bằng cách sử dụng đường ống.

// Ví dụ2.c
#bao gồm
#bao gồm
#bao gồm
#bao gồm
#bao gồm

NSchủ chốt()
{
NSnộp đơn[2],nbyte;
pid_t childpid;
chardây[] = 'Chào thế giới! ';
charbộ đệm đọc[80];

đường ống(nộp đơn);

nếu như((trẻ con=cái nĩa()) == -1)
{
kẻ gian tà ('cái nĩa');
lối ra (1);
}

nếu như(trẻ con== 0)
{
gần(nộp đơn[0]);// Tiến trình con không cần phần cuối này của đường ống

/ * Gửi 'chuỗi' qua phía đầu ra của ống * /
viết(nộp đơn[1],dây, ( strlen (dây)+1));
lối ra (0);
}
khác
{
/ * Quy trình chính đóng phía đầu ra của đường ống * /
gần(nộp đơn[1]);// Tiến trình mẹ không cần phần cuối này của đường ống

/ * Đọc trong một chuỗi từ ống dẫn * /
nbyte=đọc(nộp đơn[0],bộ đệm đọc, kích thước(bộ đệm đọc));
printf ('Đọc chuỗi:% s',bộ đệm đọc);
}

trở lại(0);
}

Đầu tiên, một đường ống đã được tạo bằng cách sử dụng hàm đường ống, sau đó một quá trình con đã được chia nhỏ. Sau đó, tiến trình con đóng phần cuối đã đọc và ghi vào đường ống. Tiến trình mẹ đóng phần cuối ghi và đọc từ đường ống và hiển thị nó. Ở đây luồng dữ liệu chỉ có một chiều là từ con đến cha.

Phần kết luận:

đường ống() là một lệnh gọi hệ thống mạnh mẽ trong Linux. Trong bài viết này, chúng ta chỉ thấy luồng dữ liệu một chiều, một quá trình ghi và một quá trình khác đọc, tạo ra hai đường ống, chúng ta cũng có thể đạt được luồng dữ liệu hai chiều.