【发布时间】:2015-12-04 17:51:01
【问题描述】:
由于某种原因,如果我再次打开它,它会编译,但是当我尝试运行它时,它不会像它被锁定那样做任何事情。它缺少许多其他功能,因为它是一个学校项目正在进行的工作。如果我删除其中一个 open(),程序运行得很好。
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUFFER_SIZE 100
#define INPUT "/tmp/father"
int main(int argc, char **argv)
{
int fds;
int fd;
char mode[BUFFER_SIZE];
char buffer[BUFFER_SIZE];
unlink(INPUT);
mkfifo(INPUT, S_IRUSR | S_IWUSR);
if(argc != 2)
{
fputs("Argumentos invalidos\n", stderr);
exit(EXIT_FAILURE);
}
fd = open(argv[1], O_WRONLY);
if(fd == -1)
{
fprintf(stderr, "\nCan't open pipe\n");
exit(EXIT_FAILURE);
}
fds = open(INPUT, O_RDONLY);
if(fds == -1)
{
fprintf(stderr, "\nCan't open pipe\n");
exit(EXIT_FAILURE);
}
while(1)
{
fgets(buffer,BUFFER_SIZE,stdin);
sscanf(buffer,"%s", mode);
write(fd,buffer,strlen(buffer));
}
}
【问题讨论】:
-
检查
unlink()和mkfifo()的返回值。另外,请阅读:stackoverflow.com/questions/8507810/… 和此:stackoverflow.com/questions/580013/… -
您是否要打开同一个文件两次?这可能是不可能的,特别是因为你打开了一个写句柄。您需要先关闭()文件的句柄。
-
在我的另一个程序中,我正在执行“int Father = open(”/tmp/father", O_WRONLY);“/tmp/father 和 argv[1] 都是命名管道
-
你说它没有像它被锁定一样,但它有多远?
fgets(buffer, BUFFER_SIZE, stdin);将阻塞,直到从标准输入中读取一行。如果 FIFO 中没有剩余空间,write(fd, buffer, strlen(buffer));将阻塞。 -
希望您的其他程序也不会取消链接并创建“/tmp/father”!
标签: c