- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我必须使用 linux 的系统调用完成一个练习:
我发现我可以用系统调用打开文件 open
可以同时打开输入文件(标志 O_RDONLY
)和输出文件(标志 O_CREAT | O_WRONLY
)。
输入文件工作正常。输出文件没有。
Errno 表示代码 2 =“没有这样的文件或目录”(显然,我要求创建文件)。我做错了什么?
P.S.:为了强调我正在使用系统调用,我没有调用函数 open(...)
但是syscall(SYS_OPEN, ...)
outFileDesc = syscall(SYS_OPEN, "testoutput.txt", O_WRONLY | O_TRUNC | O_CREAT, 438);
if(outFileDesc == -1) {
int code = errno;
// gdb used here -> print code -> 2
char str[] = "Unable to open \"testoutput.txt\"\n";
syscall(SYS_WRITE, FILE_DESC_STDOUT, str, sizeof(str)/sizeof(char));
syscall(SYS_CLOSE, inFileDesc);
syscall(SYS_EXIT, 1);
return 1;
}
完整代码:
#include <unistd.h>
#include <sys/syscall.h>
#include <errno.h>
/* file flags fcntl.h */
#define O_RDONLY 0x0000 /* open for reading only */
#define O_WRONLY 0x0001 /* open for writing only */
#define O_CREAT 0x0200 /* create if nonexistant */
#define O_TRUNC 0x0400 /* truncate to zero length */
#define FILE_DESC_STDOUT 1
#define SYS_EXIT 1
#define SYS_READ 3
#define SYS_WRITE 4
#define SYS_OPEN 5
#define SYS_CLOSE 6
#define IN_MESSAGE_LEN 9
#define OUT_MESSAGE_LEN 9
char inBuffer[IN_MESSAGE_LEN];
char outBuffer[OUT_MESSAGE_LEN];
int main (int argc, char *argv[])
{
int inFileDesc, outFileDesc;
// Apertura fine di input
inFileDesc = syscall(SYS_OPEN, "testinput.txt", O_RDONLY, 438);
if(inFileDesc == -1) {
char str[] = "Unable to open \"testinput.txt\"\n";
syscall(SYS_WRITE, FILE_DESC_STDOUT, str, sizeof(str)/sizeof(char));
syscall(SYS_EXIT, 1);
return 1;
}
// Apertura fine di output
outFileDesc = syscall(SYS_OPEN, "testoutput.txt", O_WRONLY | O_TRUNC | O_CREAT, 438);
if(outFileDesc == -1) {
int code = errno;
char str[] = "Unable to open \"testoutput.txt\"\n";
syscall(SYS_WRITE, FILE_DESC_STDOUT, str, sizeof(str)/sizeof(char));
syscall(SYS_CLOSE, inFileDesc);
syscall(SYS_EXIT, 1);
return 1;
}
// Travaso contenuto file di input in file di output
int read, i;
while((read = syscall(SYS_READ, inFileDesc, inBuffer, IN_MESSAGE_LEN)) != 0) {
for(i = 0; i < IN_MESSAGE_LEN; i++) {
outBuffer[i] = inBuffer[i];
}
syscall(SYS_WRITE, outFileDesc, outBuffer, OUT_MESSAGE_LEN);
}
syscall(SYS_CLOSE, inFileDesc);
syscall(SYS_CLOSE, outFileDesc);
syscall(SYS_EXIT, 0);
return 0;
}
最佳答案
我在 strace
下运行了你的代码并得到:
...
open("testinput.txt", O_RDONLY) = 3
open("testoutput.txt", O_WRONLY|O_TRUNC|O_APPEND) = -1 ENOENT (No such file or directory)
// ^^^^^^^^
即您对 O_*
标志的定义是错误的。
事实证明,不止一件事是错误的:0x0200
实际上是 O_TRUNC
(不是 O_CREAT
),而 0x0400
实际上是 O_APPEND
(不是 O_TRUNC
)。
将其更改为
#define O_CREAT 0x0040
#define O_TRUNC 0x0200
让它发挥作用。
关于c - 系统调用 "open"无法使用 O_CREAT 标志创建文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38026725/
我有这行代码: int outputfd = open(charArray[a + 1], O_CREAT| O_WRONLY | O_TRUNC | S_IWUSR, 0640); 如果文件已经存在
我创建了一个带有标志 O_CREAT 的文件,但是当我尝试用记事本打开创建的“out.txt”时。它说“无法打开此文件”或类似“访问被拒绝”的内容。 fd = open("out.txt", O_CR
使用open 和O_CREAT 创建文件时,必须将权限掩码作为函数的第三个参数给出。在 Windows 上,0777 就足够了,但在 Linux 或其他类 Unix 系统上,可能认为指定更严格的内容会
如何将 *argv[] 中的八进制字符串用于以下内容: open("outfile",O_CREAT | O_RDWR,0777); 0777 表示八进制数的许可。 我的代码: int arC = a
我有一个小型 C 程序,它可以像这样打开/创建一个 shm 区域: s = shm_open("/run/shm/procman_power", O_RDWR|O_CREAT, S_IRUSR|S_I
我有以下简单程序: #include #include #include #include using namespace std; int main() { string data
我有一个程序试图创建一个文件并写入其中,但由于某种原因,当我使用 O_CREAT 标志时出现错误 No such file or directory 产生错误的代码部分: (char *) dataf
在我的 C 代码中,我使用 open() 和选项 O_CREAT|O_RDWR 写入文件,然后是 write(): readfd = open("ak.bin", O_CREAT|O_RDWR
我正在尝试使用 open 函数创建一个文件,并将其命名为 dest_fd = open(fileLocation, O_RDWR | O_CREAT, 0666) 当我运行代码时,我得到: fileL
我在 O_APPEND | 中打开了一个名为“pranav”的文本文件O_CREAT模式如下图: #include #include #include main
在 Linux 上的 C 中有没有办法只写入一个已经存在的文件?换句话说,与 open(..., O_CREAT|O_EXCL) 相反。 请注意,我不希望存在性检查与文件的实际打开分离(例如预先调用
当与 O_CREAT 标志一起使用时,UNIX open() 函数的定义是它需要一个名为 mode 的第三个参数来设置文件的权限。 如果未指定模式会怎样? int file; static const
我有 10 个进程尝试使用 open(O_CREAT) 调用或多或少地同时打开同一个文件,然后将其删除。是否有任何可靠的方法来找出哪个进程实际创建了文件以及哪个进程打开了已经创建的文件,例如,如果我想
该函数将一个无符号整型数组保存在一个文件中。我希望它覆盖现有文件或创建它。如果该文件不存在,则正确填写。如果它已经存在,它将保持原样:但我希望它被覆盖。这就是我使用“O_CREAT”的原因。 int
我正在尝试在 C 中的初始化函数中创建信号量: void sem_init(int size, sem_t** sem1, sem_t** sem2) { char* semname1 = "/s
我正在运行 Ubuntu 16.04,内核版本为 4.8.0,glibc 版本为 2.23。当我使用标志 O_DIRECTORY 和 O_CREAT 执行 open 并且目录不存在时,将创建一个常规文
根据http://man7.org/linux/man-pages/man3/shm_open.3.html , 它说 After a successful shm_unlink(), attemp
我必须使用 linux 的系统调用完成一个练习: 打开文件“testinput.txt”(已经存在于工作目录中,不是空的) 打开文件“testoutput.txt”(不在工作目录中) 将testinp
我是 Go 新手,在读取默认文件权限/系统掩码时遇到一些问题。当然我可以指定固定权限: f, err := os.OpenFile(fpath, os.O_CREATE|os.O_WRONLY, 06
我需要打开一个文件进行写入。如果文件已经存在,我不想截断它。 换句话说,在纯 C 中我会这样做: int fd = open("output.bin", O_WRONLY | O_CREAT, 066
我是一名优秀的程序员,十分优秀!