我有一个简单的程序,该程序通过命名管道从子进程到父进程传递值:
#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进行读写操作,但没有解决任何问题。
答案 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
存在。