无法打开()第二个文件 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 无法连接到数据源“

ShellExecute无法打开文件夹

转--程序无法添加到打开方式列表里解决方法

打开excel时,提示更新链接