Использование именованных каналов в c - PullRequest
0 голосов
/ 26 мая 2019

У меня есть эта простая программа, которая передает значение через именованный канал от дочернего к родительскому процессу:

#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <fcntl.h>
 #include <sys/wait.h>
 #include <stdio.h>

int main()
{
 char * myfifo = "/home/tmp/myfifo";
   mkfifo(myfifo, 0666);
   int fd,rec;
   pid_t c=fork();

   if(c==0){
   fd = open(myfifo, O_WRONLY);
   rec=100;
   write(fd, rec, sizeof(rec));

   }
   if(c>0){
   sleep(1);
    fd = open(myfifo, O_RDONLY);
     read(fd, rec, sizeof(rec));
     printf("%d\n",fd);
     printf("%d\n",rec);

   }

}

Эта программа печатает fd = -1, и вместо rec, равной 100, она печатает адрес rec. Я также пытался вставить & rec в чтение и запись, но ничего не решило. Что я делаю не так?

1 Ответ

4 голосов
/ 26 мая 2019

Есть проблема с этой строкой:

write(fd, rec, sizeof(rec));

Это прототип write():

ssize_t write(int fd, const void *buf, size_t count);

Это означает, что вы читаете из области памяти, хранящейся вrec, а не содержание rec.

То же самое относится и к read().Вам нужно передать указатель на rec вместо rec.

Кроме того, всегда обязательно закрывайте файлы после открытия и выполняйте операции ввода-вывода для них.

Вотправильная копия вашего кода:

#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <stdio.h>

int main()
{
   const char *myfifo = "/home/tmp/myfifo";
   mkfifo(myfifo, 0666);
   int fd, rec;
   pid_t c = fork();

   if(c == 0) {
       fd = open(myfifo, O_WRONLY);
       rec = 100;
       write(fd, &rec, sizeof(rec));
       close(fd);
   }
   if(c > 0) {
       sleep(1);
       fd = open(myfifo, O_RDONLY);
       read(fd, &rec, sizeof(rec));
       printf("%d\n", fd);
       printf("%d\n", rec);
       close(fd);
   }
}

Конечно, всегда убедитесь, что у вас есть необходимые разрешения для создания, чтения и записи файлов в этом каталоге.Также убедитесь, что каталог /home/tmp существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...