小编OnT*_*Way的帖子

在C中没有警告的情况下将double常量赋给float变量?

在C编程语言中,浮点常量默认为double类型,
因此3.1415是double类型,除非使用'f'或'F'后缀来指示float类型.

我认为const float pi = 3.1415会引起警告,但事实并非如此.

当我用-Wall在gcc下尝试这些时:

float f = 3.1415926;  
double d = 3.1415926;  
printf("f: %f\n", f);  
printf("d: %f\n", d);  
f = 3.1415926f;  
printf("f: %f\n", f);  
int i = 3.1415926;  
printf("i: %d\n", i);  
Run Code Online (Sandbox Code Playgroud)

结果是:

f: 3.141593  
d: 3.141593  
f: 3.141593  
i: 3
Run Code Online (Sandbox Code Playgroud)

结果(包括双变量)显然会失去精度,但编译时没有任何警告.
那么编译器对此做了什么?还是我误解了什么?

c floating-point

7
推荐指数
1
解决办法
8575
查看次数

如何从其成员的地址获取struct的起始地址

在C语言中,如何从其成员的地址获取struct的起始地址?

struct type1 {
    //...
    int member1;
    //...
};
struct type1 obj1;
Run Code Online (Sandbox Code Playgroud)

并且ptr1是成员的地址member1obj1,如何定义
#define start_add(ptr1, type1, member1)获得OBJ1的
起始地址?

c struct memory-address

6
推荐指数
1
解决办法
2898
查看次数

[APUE]父和子在fork之后共享相同的文件偏移量吗?

在APUE第8.3节中fork function,关于父进程和子进程之间的文件共享,
它说:It is important that the parent and the child share the same file offset.

在第8.9节中Race Conditions,有一个例子:父和子都写入
一个在调用fork函数之前打开的文件.该程序包含竞争条件,
因为输出取决于内核运行进程的顺序以及每个进程运行的时间.

但在我的测试代码中,输出是重叠的.

[Langzi @ Freedom apue] $ cat race.out
这是一个漫长的输出,这是父母的长输出

看起来父和子具有单独的文件偏移而不是共享相同的偏移量.

我的代码中有错误吗?或者我是否误解了共享偏移的含义?
任何建议和帮助将不胜感激.

以下是我的代码:

#include "apue.h"
#include <fcntl.h>

void charatatime(int fd, char *);

int main()
{
 pid_t pid;
 int fd;
 if ((fd = open("race.out", (O_WRONLY | O_CREAT |  O_TRUNC),
     S_IRUSR | S_IWUSR)) < 0)
  err_sys("open error");

 if ((pid = fork()) < 0)
  err_sys("fork error");
 else if …
Run Code Online (Sandbox Code Playgroud)

c unix file-io fork race-condition

5
推荐指数
2
解决办法
4106
查看次数

即使在处理程序中重置,SIGALRM的信号处理程序也不起作用

第10.6节的示例代码,预期结果是:
在几次迭代之后,getpwnam使用的静态结构将被破坏,程序将以SIGSEGV信号终止.

但在我的平台上,Fedora 11,gcc(GCC)4.4.0,结果是

[Langzi @ Freedom apue] sig_alarm
中$ ./corrupt

我只能看到sig_alarm一次输出,程序似乎因某种原因而挂起,但它确实存在,并且仍在运行.
但是当我尝试使用gdb来运行程序时,似乎没问题,我会sig_alarm定期看到输出.

从我的手册中可以看出,在处理完信号后,信号处理程序将被设置为SIG_DEF,系统不会阻塞信号.所以在我的信号处理程序的开头,我重置了信号处理程序.

也许我应该使用sigaction,但我只想知道正常运行和gdb运行之间差异的原因.

任何建议和帮助将不胜感激.

以下是我的代码:

#include "apue.h"
#include <pwd.h>

void sig_alarm(int signo);

int main()
{
  struct passwd *pwdptr;
  signal(SIGALRM, sig_alarm);

  alarm(1);
  for(;;) {
    if ((pwdptr = getpwnam("Zhijin")) == NULL)
      err_sys("getpwnam error");
    if (strcmp("Zhijin", pwdptr->pw_name) != 0) {
      printf("data corrupted, pw_name: %s\n", pwdptr->pw_name);
    }
  }
}

void sig_alarm(int signo)
{
  signal(SIGALRM, sig_alarm);
  struct passwd *rootptr;
  printf("in sig_alarm\n");

  if ((rootptr = getpwnam("root")) == NULL)
    err_sys("getpwnam error"); …
Run Code Online (Sandbox Code Playgroud)

c linux signals

2
推荐指数
1
解决办法
1万
查看次数