在Linux系統中,C++程序可以通過系統調用(syscalls)與操作系統內核進行交互。系統調用是用戶空間程序請求內核服務的一種機制。它們提供了一系列基本功能,如文件操作、進程控制、通信等。
以下是一些常用的Linux系統調用及其在C++中的使用方法:
open(): 打開一個文件。
#include <fcntl.h>
int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("open");
}
read(): 從文件描述符讀取數據。
char buffer[1024];
ssize_t bytesRead = read(fd, buffer, sizeof(buffer));
if (bytesRead == -1) {
perror("read");
}
write(): 向文件描述符寫入數據。
const char* data = "Hello, World!";
ssize_t bytesWritten = write(fd, data, strlen(data));
if (bytesWritten == -1) {
perror("write");
}
close(): 關閉文件描述符。
close(fd);
fork(): 創建一個新進程。
pid_t pid = fork();
if (pid == -1) {
perror("fork");
} else if (pid == 0) {
// 子進程
execl("/bin/ls", "ls", NULL);
perror("execl");
exit(1);
} else {
// 父進程
wait(NULL);
}
exec()系列: 執行一個新的程序。
execl("/bin/ls", "ls", NULL);
perror("execl");
exit(1);
wait(): 等待子進程結束。
pid_t pid = fork();
if (pid == -1) {
perror("fork");
} else if (pid == 0) {
// 子進程
execl("/bin/ls", "ls", NULL);
perror("execl");
exit(1);
} else {
// 父進程
int status;
waitpid(pid, &status, 0);
}
#include <csignal>
void handler(int signum) {
std::cout << "Received signal " << signum << std::endl;
}
int main() {
signal(SIGINT, handler);
while (true) {
// 主循環
}
return 0;
}
socket(): 創建一個套接字。
#include <sys/socket.h>
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket");
}
bind(): 綁定套接字到地址。
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(8080);
if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
perror("bind");
}
listen(): 監聽連接。
if (listen(sockfd, 5) == -1) {
perror("listen");
}
accept(): 接受連接。
struct sockaddr_in cli_addr;
socklen_t clilen = sizeof(cli_addr);
int newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen);
if (newsockfd == -1) {
perror("accept");
}
connect(): 連接到服務器。
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
perror("connect");
}
mmap(): 映射文件或設備到內存。
void* addr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);
if (addr == MAP_FAILED) {
perror("mmap");
}
munmap(): 解除內存映射。
if (munmap(addr, length) == -1) {
perror("munmap");
}
perror()
函數可以打印錯誤信息。通過這些系統調用,C++程序可以在Linux系統上實現各種復雜的功能。