linux write失败,怎么打印错误码
时间: 2023-10-02 12:08:18 浏览: 130
在Linux中,可以使用perror函数打印错误码。具体方法如下:
1. 在程序中包含<errno.h>头文件。
2. 在write调用后,判断其返回值是否小于0。
3. 如果小于0,使用perror函数打印错误信息和错误码。
示例代码如下:
```
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
int main() {
char buf[] = "Hello, world!";
ssize_t ret = write(STDOUT_FILENO, buf, sizeof(buf));
if (ret < 0) {
perror("write error");
}
return 0;
}
```
在执行该程序时,如果write失败,会输出类似如下的错误信息:
```
write error: Bad file descriptor
```
其中,"Bad file descriptor"就是错误信息,而错误码则会在该信息之前打印出来。
相关问题
regmap_raw_write()
regmap_raw_write() 是 regmap 框架中用于直接向寄存器写入原始数据的函数。其函数原型如下:
```
int regmap_raw_write(struct regmap *map, unsigned int reg, const void *val,
size_t val_len);
```
其中,map 是一个指向 regmap 结构体的指针,reg 是要写入的寄存器地址,val 是一个指向要写入的数据的指针,val_len 是要写入的数据长度。
下面是一个示例,演示如何使用 regmap_raw_write() 函数向 I2C 设备的寄存器写入数据:
```
#include <linux/regmap.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
int write_i2c_reg(struct regmap *map, u8 reg, u8 *data, u8 len)
{
int ret;
ret = regmap_raw_write(map, reg, data, len);
if (ret < 0) {
dev_err(map->dev, "Failed to write to I2C device\n");
return ret;
}
return 0;
}
int probe(struct i2c_client *client)
{
struct regmap_config config = {
.reg_bits = 8,
.val_bits = 8,
.max_register = 0xff,
.write_flag_mask = 0x80,
.cache_type = REGCACHE_NONE,
};
struct regmap *map;
int ret;
u8 data[2] = {0xAA, 0xBB};
map = devm_regmap_init_i2c(client, &config);
if (IS_ERR(map)) {
ret = PTR_ERR(map);
dev_err(&client->dev, "Failed to initialize regmap: %d\n", ret);
return ret;
}
ret = write_i2c_reg(map, 0x12, data, 2);
if (ret) {
dev_err(&client->dev, "Failed to write register\n");
return ret;
}
return 0;
}
```
在此示例中,probe() 函数使用 devm_regmap_init_i2c() 函数初始化一个 regmap 结构体,然后调用 write_i2c_reg() 函数向指定寄存器写入数据。write_i2c_reg() 函数通过调用 regmap_raw_write() 函数来实现,其中,map 是一个指向 regmap 结构体的指针,reg 是要写入的寄存器地址,data 是一个指向要写入的数据的指针,len 是要写入的数据长度。如果写入操作失败,则函数会返回错误码。
linux环境 mkfifo函数
在 Linux 环境中,`mkfifo()` 函数用于创建一个命名管道。命名管道是一种特殊的文件,用于实现进程间通信。它与普通文件的区别在于,它的数据只能被读取一次,读取后就被删除,不能被重复读取。
`mkfifo()` 函数的原型如下:
```c
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
```
其中,`pathname` 参数是要创建的命名管道的路径名;`mode` 参数是文件权限,它指定了文件的访问权限和所有权等信息。
`mkfifo()` 函数成功返回 0,失败返回 -1,并设置相应的错误码。创建成功后,可以使用 `open()` 函数打开该命名管道进行读写操作,使用 `unlink()` 函数删除该文件。
下面是一个简单的示例程序,演示如何使用 `mkfifo()` 函数创建一个命名管道:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
const char *fifo_file = "myfifo";
int ret;
// 创建命名管道
ret = mkfifo(fifo_file, 0666);
if (ret < 0) {
perror("mkfifo");
exit(1);
}
// 打开命名管道进行读写操作
int fd = open(fifo_file, O_RDWR);
if (fd < 0) {
perror("open");
exit(1);
}
// 写入一条消息
const char *msg = "Hello, named pipe!\n";
write(fd, msg, strlen(msg));
// 关闭文件描述符
close(fd);
// 删除文件
unlink(fifo_file);
return 0;
}
```
在该示例程序中,我们首先使用 `mkfifo()` 函数创建了一个名为 `myfifo` 的命名管道,然后使用 `open()` 函数打开该文件进行写操作,写入一条消息后关闭文件描述符,最后使用 `unlink()` 函数删除该文件。