cuốn sách gpt4 ai đã làm

C - Đường ống được đặt tên giữa quy trình cấp cao nhất và quy trình cấp dưới cùng (lá)

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 00:02:57 28 4
mua khóa gpt4 Nike

Tôi đang cố gắng ghi vào một đường ống có tên từ quy trình lá dưới cùng và đọc từ đường ống của quy trình trên cùng.

Để làm điều này, trước tiên tôi tạo một FIFO trong quy trình cấp cao nhất, sau đó sử dụng vòng lặp for để tạo ra nhiều quy trình hơn. Trong vòng lặp for, tôi đang kiểm tra quy trình lá và nếu đó là lá thì tôi sẽ viết thư cho FIFO và thoát khỏi vòng lặp. Sau đó, sau vòng lặp, tôi cố gắng đọc từ FIFO ở quy trình trên cùng. Điều này không có tác dụng, chương trình của tôi bị kẹt và dừng sau khi tạo quy trình lá.

Làm cách nào để gửi tin nhắn từ các nút lá trở lại quy trình gốc trên cùng thông qua FIFO?

Mã số:

#include 
#include
#include
#include
#include
#include
#include
#include
#include

#defineMAX_BUF 1024

int main(int argc, char **argv){

int numprocs = atoi(argv[1]);
int lev = numprocs;
fprintf(stdout,"ALIVE: Quá trình cấp %d với pid=%d, con của ppid=%d.\n", lev, getpid(), getppid());

// tạo bộ nhớ dùng chung
const int SIZE = numprocs * sizeof(int);
const char *name = "dleggio1OS";
int shm_fd;
int *ptr;
shm_fd = shm_open(tên, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SIZE);
ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);
*ptr = getpid();

// tạo fifo
int fd;
char *myfifo = "/tmp/dleggio1fifo";
mkfifo(myfifo, 0666);

// quy trình sinh sản
int i;
for(i = 1; i < numprocs; i++){
lev--;
int pfds[2];
char buf[30];
if(pipe(pfds) == -1){
lỗi ("ống");
exit(1);
}
pid_t pid;


if((pid = fork()) < 0){
perror("ngã ba");
exit(1);
}

if(pid == 0){ //con

const int SIZE = numprocs * sizeof(int);
const char *name = "dleggio1OS";
int shm_fd;
int *ptr;
shm_fd = shm_open(tên, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SIZE);
ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);
ptr[i] = getpid();

đóng(pfds[1]);
if(read(pfds[0], buf, 3) <= 0){
perror("con");
exit(1);
}
int check = atoi(buf);
fprintf(stdout,"ALIVE: Quá trình cấp %d với pid=%d, con của ppid=%d.\n", check, getpid(), getppid());

if(kiểm tra == 1){ //lá
fd = open(myfifo, O_WRONLY);
write(fd,"lá", sizeof("lá"));
đóng(fd);
phá vỡ;
}

}
khác{ // cha mẹ
đóng(pfds[0]);
giữ ký tự [3];
sprintf(hold,"%d",lev);
if(write(pfds[1], hold, 3) <= 0){
perror("cha mẹ");
exit(1);
}

chờ đợi(NULL);
return 0;
}
}

//đọc fifo
buff char[MAX_BUF];
fd = open(myfifo,O_RDONLY);
đọc(fd,buff,MAX_BUF);
đóng(fd);

shm_unlink(tên);
hủy liên kết(myfifo);
return 0;
}

Đầu ra:

SỐNG: Quy trình cấp 3 với pid=554, con của ppid=451.
SỐNG: Quy trình cấp 2 với pid=555, con của ppid=554.
SỐNG: Quy trình cấp 1 với pid=556, con của ppid=555.
_ // <---- đứng ở đây

câu trả lời hay nhất

Tất cả các quy trình đều bị kẹt trong lệnh gọi "wait()" (tức là đang chờ một trong các quy trình con của nó thoát ra), ngoại trừ quy trình con của nhánh cuối cùng... bị kẹt trên "open(myfifo, O_WRONLY)". ..đứa trẻ cuối cùng sẽ tiếp tục bị treo cho đến khi một tiến trình mở fifo để đọc...

Về các đường ống có tên C giữa các quy trình cấp cao nhất và cơ bản (lá), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/35705514/

28 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress