APUE 第二版 習題3.6
result:
wo de meng
write error!
在csdn論壇上問了這個問題,感謝brookmill的指導!
brookmill在給出答案的同時,還給出了查找問題根源的方法。以下是他的答覆:
if (write(fd, buf, n) != n)
{
printf("%d: %s/n", errno, strerror(errno)); // 需要errno.h和string.h
printf("write error!/n");
輸出 9: Bad file descriptor
man 2 write裏面的解釋是
EBADF fd is not a valid file descriptor or is not open for writing.
所以,問題應該是出在open,
$ man 2 open
...... The argument flags must include one of the following access modes: O_RDONLY, O_WRONLY, or O_RDWR.
把open的地方改成 open(argv[1],O_RDWR|O_APPEND)
或者 open(argv[1],O_WRONLY|O_APPEND),
這樣就可以寫進去了。
小結:
用strerror打印出出錯信息真的對調試很有幫助。以後要多加運用。
另外,找出問題根源之後再來翻閱APUE,發現48頁open函數一節的確提到了這個問題:即打開或創建文件時,oflag參數中必須指定O_RDONLY,O_WRONLY,O_RDWR三個常量中的一個且只能指定一個。
小結:只看書往往會在理解上有疏漏,通過練手才能發現理解上的偏差或不足。