【问题标题】:open file linux eclipse c error after getchldgetchld后打开文件linux eclipse c错误
【发布时间】:2016-10-09 05:15:51
【问题描述】:

我只是想打开一个文件。 我已经这样做了 100 次,然后我向其他进程发送了 SIGCHLD 信号,我想在那之后我就无法再打开那个文件了。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

#define FLAGS IPC_CREAT | 0644
int main()  {
int res =open("results.txt",FLAGS);
if(res== -1) { printf("error!!")}   //prints it every time
return 0;}

..它突然发生了..帮助???

【问题讨论】:

  • 首先要做的是找出错误的具体原因,使用 errno 和/或 strerror()。 This page 应该会有所帮助。
  • 据我所知,IPC_CREAT 不是open 的有效模式。您的意思是使用shmget 吗?
  • 打印错误时,输出到stderr,而不是stdout。并输出操作系统认为是问题的消息。 IE。使用:perror(),而不是printf()
  • 为了便于阅读和理解,1) 遵循公理:每行只有一个语句,并且(最多)每条语句一个变量声明。 2) 一致地缩进代码.在每个左大括号 '{' 后缩进。在每个右大括号 '}' 之前取消缩进。切勿使用制表符进行缩进。建议为每个缩进级别使用 4 个空格,因为即使使用可变宽度字体也是可见的。
  • IPC_CREAT 应该是:O_CREAT

标签: c linux eclipse signals creation


【解决方案1】:

你对旗帜做了一些奇怪的事情。我认为您的意图是按照以下代码:

#define FLAGS O_CREAT
#define MODE 0644
int main()  
{
    int res =open("results.txt",FLAGS,MODE);
    if(res== -1) { printf("error!!");}   //prints it every time
    return 0;
}

【讨论】:

  • 由于在调用printf() 语句时缺少尾随分号,因此无法编译此答案
【解决方案2】:

以下代码:

  1. 干净编译
  2. 正确调用open()函数
  3. 正确显示错误信息
  4. #include不使用的头文件
  5. 始终缩进代码
  6. 遵循公理:`每行只有一个语句,并且(最多)每条语句有一个变量声明。
  7. 通过空行分隔代码块(for、if、else、while、do...while、switch、case、default)
  8. main() 函数使用正确的签名(发布代码中的空括号表示允许任何数量的参数,包括0 个参数
  9. 发生错误时代码不应返回 0成功,因此请使用 exit( EXIT_FAILURE )

现在是代码:

#include <stdio.h>   // perror()
#include <stdlib.h>  // exit(), EXIT_FAILURE
#include <unistd.h>  // open()
#include <fcntl.h>   // O_CREAT

#define FLAGS O_CREAT
#define MODE 0644

int main( void )
{
    int res =open("results.txt", FLAGS, MODE);
    if(res== -1)
    {
        perror( "open for results.txt failed" );
        exit( EXIT_FAILURE );
    }   

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多