在C中使用命名管道

时间:2019-05-26 17:18:48

标签: c

我有一个简单的程序,该程序通过命名管道从子进程到父进程传递值:

#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 个答案:

答案 0 :(得分:4)

此行有问题:

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

这是write()的原型:

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

这意味着您是从rec中存储的存储位置读取的,而不是rec的内容。

read()同样适用。您需要传递指向rec的指针,而不是rec本身。

此外,请务必确保在打开文件并对其执行I / O之后关闭文件。

这是您代码的正确副本:

#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存在。