Mọi người cho m hỏi có những cách nào để xác định được kích thước của pipe trong hệ điều hành Linux ạ?( K dùng hàm có sẵn )
Có những cách nào để xác định được kích thước của pipe trong hệ điều hành Linux?
Ghi vào pipe khi nào không ghi được nữa thì thôi.
Bạn có thể nói rõ hơn k ạ??
Làm thế nào để bạn có thể đo thể tích của một cái lu? Đơn giản nhất là bạn lấy 1 cái xô nước 1 lít và đổ tới khi nào cái lu đầy thì thôi. Khi đó số lần đổ xô = số lít trong lu.
Tương tự cho pipe, bạn write lần tượng một byte khi nào write không được nữa thì đó là kích thước của pipe.
M có viết chương trình như vậy cũng ghi vào pipe cho đến khi k ghi đc nữa thì thôi, nhưng yêu cầu không được dùng hàm fcntl,mà nếu m bỏ hàm fcntl đi chương trình k in kết quả. bạn có thể giải thích giúp m k?
Nút print screen của bạn đâu rồi?
Thì thay vì in ra ngoài, thì in bên trong hàm while luôn.
Vì khi write lố, pipe bị block nên không in ra được.
Cách này cũng là 1 cách để biết pipe buffer có độ lớn bao nhiêu. Tuy nhiên chương trình sẽ bị block.
Còn cách mà không dùng fcntl thì ngoài cách block trên mình không biết rồi.
Ok, cảm ơn b nhiều nhà,
#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int fds[2];
if (pipe(fds) < 0) {
printf("Error");
return -1;
}
int size = 0;
int out = 0;
asm(
"mov eax, 0x37;" // sys_fcntl
"mov ebx, %0;" // fd
"mov ecx, 0x04;" // F_SETFL
"mov edx, 04000;" // O_NONBLOCK
"int 0x80;" // interrupt to handle system call
::"g"(fds[1])
:"eax","ebx","ecx","edx"
);
while(write(fds[1], "q", 1) > 0) {
size++;
}
printf("SIZE: %d\n", size);
return 0;
}
:"> Thầy/Cô không cho dùng hàm thì mình dùng inline assembly với system call vậy
Compile
gcc -o [file_out] [file_in].c -masm=intel -m32
Vậy chắc phức tạp hơn rồi, m k học assembly.
Ồ sorry mình không biết. Vậy chắc phải đợi thầy/cô giải rồi.
cảm ơn b nha, comment rất có tâm