在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语言中,如何从其成员的地址获取struct的起始地址?
struct type1 {
//...
int member1;
//...
};
struct type1 obj1;
Run Code Online (Sandbox Code Playgroud)
并且ptr1是成员的地址member1中obj1,如何定义
宏#define start_add(ptr1, type1, member1)获得OBJ1的
起始地址?
在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) 第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)