无法打开()第二个文件 C
Posted
技术标签:
【中文标题】无法打开()第二个文件 C【英文标题】:Can't open() second file C 【发布时间】: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()
的返回值。另外,请阅读:***.com/questions/8507810/… 和此:***.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”!
【参考方案1】:
你确定有问题吗?您正在从标准输入(底部的fgets
)读取,并写入管道。您缺少的是从管道中读取的内容。因此,如果您在另一个终端中键入:
$ cat /tmp/father
然后您在 prog 中键入的任何内容都会出现在那里。
所以,我在一个终端中:
$ ./test /tmp/father
line one
line two
在第二个终端:
$ cat /tmp/father
我明白了:
line one
line two
没有?
附:您正在使用sscanf
读取buffer
并写入mode
,然后写出buffer
字符串。没关系,但你没有使用mode
。
【讨论】:
if(strcmp(mode,"stats") == 0) read(fds,buff,BUFFER_SIZE); printf("%s\n",buff); argv[1] 是 /tmp/par-shell-in ,在另一个程序中创建。该其他程序创建 par-shell-in 然后将标准输入重定向到该管道。如果它从该管道读取统计信息(由上面的代码发送),则将我需要的字符串写入 /tmp/father。 所以我对您的尝试感到困惑。您写入argv[1]
中指定的文件,即描述符fd
。您从stdin
读取字符,并将它们写入fd
。描述符fds
是管道的读取端,您无需对其进行任何操作。如果您将argv[1]
指定为/tmp/father,那么您正在写入管道的写入端(但没有任何内容在读取它——因此cat
有效)......以上是关于无法打开()第二个文件 C的主要内容,如果未能解决你的问题,请参考以下文章
SWIFT 无法使用第二个按钮在 UIWebView 中打开第二个 URL
双击磁盘打不开,按右键有两个”打开”选项,选第一个时说windows无法找到setup.exe,选第二个可以打开.
Tableau Desktop 日常问题 5.0打开第二个 Tableau 桌面实例时出现错误“连接错误:Tableau 无法连接到数据源“