Linux C 编程试题精选

1. Linux C 编程试题精选

本文将为您提供一些经典的Linux C编程试题。这些试题旨在考察您对Linux系统以及C语言的理解和掌握程度。通过解答这些试题,您可以检验自己的编程能力,并深入了解Linux C编程的各个方面。

2. 进程和线程

2.1 进程间通信

进程间通信是多进程编程中非常重要的一个概念。在Linux系统中,有多种方法可以实现进程间的通信,比如管道、共享内存、信号量等。

以下是一个使用共享内存进行进程间通信的例子:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#define SHM_SIZE 1024

int main() {

int shmid;

char *shmaddr;

// 创建共享内存

shmid = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666);

if (shmid == -1) {

perror("shmget");

exit(1);

}

// 在进程地址空间中映射共享内存

shmaddr = shmat(shmid, NULL, 0);

if (shmaddr == (char*)-1) {

perror("shmat");

exit(1);

}

// 在共享内存中写入数据

sprintf(shmaddr, "Hello, shared memory!");

// 从共享内存中读取数据

printf("Message from shared memory: %s\n", shmaddr);

// 解除映射并删除共享内存

shmdt(shmaddr);

shmctl(shmid, IPC_RMID, NULL);

return 0;

}

通过该例子,我们可以看到,共享内存允许多个进程访问同一块内存区域,并实现数据的共享。

2.2 线程同步

在多线程编程中,线程同步是一个重要的概念。在Linux系统中,有多种方法可以实现线程同步,比如互斥锁、条件变量、信号量等。

以下是一个使用互斥锁实现线程同步的例子:

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

#define THREAD_NUM 10

int count = 0;

pthread_mutex_t mutex;

void *thread_func(void *arg) {

int i;

for (i = 0; i < 10000; i++) {

pthread_mutex_lock(&mutex);

count++;

pthread_mutex_unlock(&mutex);

}

pthread_exit(NULL);

}

int main() {

int i;

pthread_t threads[THREAD_NUM];

// 初始化互斥锁

pthread_mutex_init(&mutex, NULL);

for (i = 0; i < THREAD_NUM; i++) {

// 创建线程

if (pthread_create(&threads[i], NULL, thread_func, NULL) != 0) {

printf("Failed to create thread\n");

exit(1);

}

}

for (i = 0; i < THREAD_NUM; i++) {

// 等待线程结束

if (pthread_join(threads[i], NULL) != 0) {

printf("Failed to join thread\n");

exit(1);

}

}

// 销毁互斥锁

pthread_mutex_destroy(&mutex);

printf("Count: %d\n", count);

return 0;

}

通过该例子,我们可以看到,互斥锁可以保证多个线程对共享资源的互斥访问,防止数据竞争。

3. 文件操作

3.1 复制文件

在Linux系统中,文件操作是非常常见的一个任务。下面的例子演示了如何使用C语言复制一个文件:

#include <stdio.h>

#include <stdlib.h>

#define BUFFER_SIZE 4096

int main(int argc, char *argv[]) {

FILE *source, *target;

char buffer[BUFFER_SIZE];

size_t bytes_read, bytes_written;

if (argc != 3) {

printf("Usage: %s source_file target_file\n", argv[0]);

exit(1);

}

// 打开源文件

source = fopen(argv[1], "rb");

if (source == NULL) {

perror("fopen");

exit(1);

}

// 创建目标文件

target = fopen(argv[2], "wb");

if (target == NULL) {

perror("fopen");

exit(1);

}

// 读取源文件并写入目标文件

while ((bytes_read = fread(buffer, 1, sizeof(buffer), source)) > 0) {

bytes_written = fwrite(buffer, 1, bytes_read, target);

if (bytes_written != bytes_read) {

perror("fwrite");

exit(1);

}

}

// 关闭文件

fclose(source);

fclose(target);

return 0;

}

通过该例子,我们可以看到,文件操作可以通过基本的API实现,比如fopen、fread、fwrite等。

3.2 删除文件

除了复制文件,删除文件也是非常常见的一个任务。下面的例子演示了如何使用C语言删除一个文件:

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char *argv[]) {

if (argc != 2) {

printf("Usage: %s file\n", argv[0]);

exit(1);

}

// 删除文件

if (remove(argv[1]) != 0) {

perror("remove");

exit(1);

}

return 0;

}

通过该例子,我们可以看到,删除文件可以通过调用remove函数实现。

4. 网络编程

4.1 TCP服务器

在网络编程中,TCP服务器是非常常见的一个应用。下面的例子演示了如何使用C语言创建一个简单的TCP服务器:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#define BUFFER_SIZE 4096

#define PORT 8888

int main() {

int server_fd, client_fd;

struct sockaddr_in server_addr, client_addr;

socklen_t client_len;

char buffer[BUFFER_SIZE];

// 创建服务器套接字

server_fd = socket(AF_INET, SOCK_STREAM, 0);

if (server_fd == -1) {

perror("socket");

exit(1);

}

// 设置服务器地址和端口

memset(&server_addr, 0, sizeof(server_addr));

server_addr.sin_family = AF_INET;

server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

server_addr.sin_port = htons(PORT);

// 绑定服务器地址和端口

if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {

perror("bind");

exit(1);

}

// 监听连接请求

if (listen(server_fd, 5) == -1) {

perror("listen");

exit(1);

}

printf("Server is listening on port %d\n", PORT);

while (1) {

// 接受客户端连接请求

client_len = sizeof(client_addr);

client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_len);

if (client_fd == -1) {

perror("accept");

exit(1);

}

printf("Client connected: %s\n", inet_ntoa(client_addr.sin_addr));

// 处理客户端请求

memset(buffer, 0, sizeof(buffer));

if (recv(client_fd, buffer, sizeof(buffer), 0) == -1) {

perror("recv");

exit(1);

}

printf("Received message: %s\n", buffer);

// 发送响应给客户端

if (send(client_fd, "Hello, client!", strlen("Hello, client!"), 0) == -1) {

perror("send");

exit(1);

}

// 关闭客户端套接字

close(client_fd);

}

// 关闭服务器套接字

close(server_fd);

return 0;

}

通过该例子,我们可以看到,TCP服务器需要创建一个套接字,并绑定地址和端口,然后监听连接请求,最后通过accept函数接受客户端连接,处理客户端请求,然后发送响应,并关闭套接字。

4.2 UDP客户端

除了TCP服务器,UDP客户端也是非常常见的一个应用。下面的例子演示了如何使用C语言创建一个简单的UDP客户端:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#define BUFFER_SIZE 4096

#define SERVER_IP "127.0.0.1"

#define SERVER_PORT 8888

int main() {

int client_fd;

struct sockaddr_in server_addr;

char buffer[BUFFER_SIZE];

// 创建客户端套接字

client_fd = socket(AF_INET, SOCK_DGRAM, 0);

if (client_fd == -1) {

perror("socket");

exit(1);

}

// 设置服务器地址和端口

memset(&server_addr, 0, sizeof(server_addr));

server_addr.sin_family = AF_INET;

server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);

server_addr.sin_port = htons(SERVER_PORT);

while (1) {

// 从标准输入读取数据

fgets(buffer, sizeof(buffer), stdin);

// 发送数据给服务器

if (sendto(client_fd, buffer, strlen(buffer), 0, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {

perror("sendto");

exit(1);

}

// 接收服务器的响应

memset(buffer, 0, sizeof(buffer));

if (recvfrom(client_fd, buffer, sizeof(buffer), 0, NULL, NULL) == -1) {

perror("recvfrom");

exit(1);

}

printf("Received message: %s\n", buffer);

}

// 关闭套接字

close(client_fd);

return 0;

}

通过该例子,我们可以看到,UDP客户端只需要创建一个套接字,然后发送数据给服务器,接收服务器的响应即可。

5. 总结

本文介绍了一些经典的Linux C编程试题,涵盖了进程和线程、文件操作以及网络编程等方面。通过解答这些试题,您可以提高自己的编程能力,并加深对Linux C编程的理解。希望本文对您有所帮助。

操作系统标签