环境:c11,gcc
资源:
#include <sys/types.h> // system types
#include <sys/stat.h> // FIFO
#include <fcntl.h> // O_NONBLOCK
#include <errno.h> // errno
#include <stdio.h> // IO
#include <string.h> // strerror
#include <unistd.h> // unlink
#define rc_succ (0)
#define rc_fail (-1)
#define no_msg ("")
#define no_flags (0)
#define FULL_RDWR (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
const char* fifo_pathname = "/tmp/vbi_flow";
int fifo_creat_flags = O_NONBLOCK | FULL_RDWR;
int mkfifo_error_resolver(int err);
int main(int argc, char** argv) {
int rc;
const int buf_size = 1024;
char buf[buf_size];
memset((void*)buf, 0x00, buf_size * sizeof(*buf));
create_fifo:
// int dummy = 0; // раскомментируйте строку и получите ошибку
// компиляции
// create FIFO
if (0 != (rc = mkfifo(fifo_pathname, (mode_t)fifo_creat_flags))) {
if (rc_succ == mkfifo_error_resolver(errno)) goto create_fifo;
perror("fifo create");
return rc_fail;
}
printf("FIFO created. Related file: %s\n", fifo_pathname);
int fifo_fd;
if (-1 == (fifo_fd = open(fifo_pathname, O_RDWR))) {
perror("open fifo file");
goto cancel;
}
printf("File %s is open.\n", fifo_pathname);
int should_cancel = 0;
while (!should_cancel) {
//
}
cancel:
// close file if exist
if (fifo_fd > 0) {
if (0 != (rc = close(fifo_fd)))
perror("close fifo file");
}
// remove file related to FIFO
if (0 != (rc = unlink(fifo_pathname))) {
perror("fifo remove");
return rc_fail;
}
printf("FIFO removed.\n");
return 0;
}
int mkfifo_error_resolver(int err) {
switch (err) {
case EEXIST:
return unlink(fifo_pathname); // unlink returns 0 if success
default:
return rc_fail;
}
}
如果你在标签的正下方声明一个变量,这会导致编译错误:
但是请注意,在标签之后create_fifo
,您可以找到声明变量的代码行fifo_fd
。它不会导致编译错误。
即使在create_file
我们 insert之后printf(...)
,才声明一个变量,这仍然会导致编译错误。
标签只能附在声明上。在 C 中(与 C++ 不同),声明不是语句。它们不能被标记。
在这种情况下,情况将
;
在标签后立即保存这将创建一个空语句,标签将附加到该语句。
声明一个变量“在标签之后的某处[远]”这一事实并没有什么了不起的。重要的是标签不直接与广告相关联。
以上适用
case
于switch
.这种差异的后果也是下面的代码
从 C++ 的角度来看是正确的,但从 C 的角度来看是不正确的。