gpt4 book ai didi

c - C 中带有通过 FIFO 管道的指针的结构

转载 作者:行者123 更新时间:2023-11-30 17:15:39 24 4
gpt4 key购买 nike

我正在尝试使用一台服务器和一个客户端设置一个 FIFO 管道。

客户端.c

#include<stdio.h> 
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>

typedef struct buffer {
int pid;
char *buffer;
} my_buffer;

/*
void removefifo() {
unlink("fifo_server");
unlink("fifo_client");
}
*/

main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "usa: %s text \n", argv[0]);
return EXIT_FAILURE;
}

FILE *file1;
int fifo_server,fifo_client;
char *buf_in;
buf_in = malloc(20*sizeof(char));

//send PID and content
my_buffer * buf_out;
buf_out = (my_buffer *)malloc(sizeof(my_buffer));
buf_out->pid = getpid();
buf_out->buffer = (char *) calloc(20,sizeof(char));
strcpy(buf_out->buffer,argv[1]);

fifo_server=open("fifo_server",O_RDWR);
if(fifo_server < 0) {
printf("Error in opening file");
exit(-1);
}

printf("buffer has PID %d and content %s \n",buf_out->pid,buf_out->buffer);


write(fifo_server,buf_out,sizeof(struct buffer));

fifo_client=open("fifo_client",O_RDWR);

if(fifo_client < 0) {
printf("Error in opening file");
exit(-1);
}


read(fifo_client,buf_in,10*sizeof(char));
printf("\n * Reply from server: %s * \n",buf_in);
close(fifo_server);
close(fifo_client);

}

服务器.c

#include<stdio.h> 
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#define FIFO_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) //0666

typedef struct buffer {
int pid;
char *buffer;
} my_buffer;




int main()
{
int fifo_server,fifo_client;
char *buf_out;
int i;

int file1,file2;

my_buffer * buf_in;
buf_in = (my_buffer *)malloc(sizeof(my_buffer));
buf_in->buffer = (char *) calloc(20,sizeof(char));
buf_out = malloc(20*sizeof(char));

//create fifo-server with p-flag
file1 = mkfifo("fifo_server",FIFO_MODE);
if(file1<0) {
printf("FIFO_SERVER already exists \n");
}

fifo_server = open("fifo_server",O_RDWR);
if(fifo_server<1) {
printf("Error opening file");
}
read(fifo_server,buf_in,sizeof(struct buffer)); //read PID and content
if(fifo_server<1) {
printf("Error opening file");
}

printf("pid %d \n",buf_in->pid);
printf("content %s \n",buf_in->buffer);

//write
strcpy(buf_out,buf_in->buffer);
for (i = 0; buf_in->buffer[i] != '\0'; i++) {
buf_out[i] = toupper(buf_in->buffer[i]);
}

//create fifo-client with p-flag
file2 = mkfifo("fifo_client",FIFO_MODE);
if(file2<0) {
printf("FIFO_CLIENT already exists \n");
}


fifo_client = open("fifo_client",O_RDWR);
write(fifo_client,buf_out,10*sizeof(char));
printf("\n Data sent to client \n");


close(fifo_server);
close(fifo_client);

}

我首先启动服务器,然后启动客户端。特别是,当我使用

运行客户端时
./client "the fox"
buffer has PID 14491 and content the fox

服务器正确显示 PID,但在打印 buf_in->buffer 时崩溃。

./server 
pid 14491
Errore di segmentazione

请征求您的建议。

最佳答案

您的struct buffer在其成员中包含一个指针。这很好,但您需要认识到,无论指向什么,如果有的话,都不是 struct 的一部分,并且指针本身充其量是 em> 在管道的另一端无效。您有两个主要选择:

  1. 为您的struct提供一个数组成员而不是指针成员:

    typedef struct buffer {
    int pid;
    char buffer[20];
    } my_buffer;
  2. 在编写数据时要更加小心。例如:

    unsigned buf_size = strlen(buf_out.buffer);
    write(fifo_client, &buf_out.pid, sizeof(buf_out.pid));
    write(fifo_client, &buf_size, sizeof(buf_size));
    write(fifo_client, buf_out.buffer, buf_size);

自然,后者必须搭配相应的读取机制。

关于c - C 中带有通过 FIFO 管道的指针的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29928776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com