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
Tôi là một lập trình viên xuất sắc, rất giỏi!