OS系统调用

进程控制:fork、exec、wait等 文件操作:open、read、write等 设备操作:ioctl等 信息维护:getpid、alarm等 通信:pipe、shmget等

进程控制

进程控制是操作系统中最基本的功能之一,主要通过以下系统调用实现:

fork()

fork() 系统调用用于创建一个新的进程,这个新进程被称为子进程,而调用fork的进程被称为父进程。

exec()

exec系列系统调用(execve、execl、execlp等)用于在当前进程中加载并执行新的程序。

c
// 示例:使用execl执行ls命令
execl("/bin/ls", "ls", "-l", NULL);

wait()

wait系列系统调用(wait、waitpid)用于父进程等待子进程结束。

实际应用场景

在Java中,虽然不直接使用这些系统调用,但Runtime.exec()和ProcessBuilder在底层就是通过这些系统调用来实现的:

java
// 使用ProcessBuilder执行系统命令
ProcessBuilder pb = new ProcessBuilder("ls", "-l");
Process process = pb.start();
int exitCode = process.waitFor(); // 等待进程结束

文件操作

文件操作是操作系统提供的另一个重要功能,主要包括以下系统调用:

open()

open() 系统调用用于打开或创建一个文件。

read() 和 write()

这两个系统调用用于文件的读写操作。

c
// 文件读写示例
int fd = open("test.txt", O_RDWR);
char buffer[1024];
ssize_t bytes_read = read(fd, buffer, sizeof(buffer));
ssize_t bytes_written = write(fd, "Hello", 5);

实际应用场景

Java的FileInputStream和FileOutputStream在底层就是通过这些系统调用实现的:

java
// Java文件操作示例
try (FileInputStream fis = new FileInputStream("input.txt");
     FileOutputStream fos = new FileOutputStream("output.txt")) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = fis.read(buffer)) != -1) {
        fos.write(buffer, 0, bytesRead);
    }
}

设备操作

设备操作主要通过ioctl系统调用来实现,它提供了一种统一的接口来控制各种设备。

ioctl()

ioctl (input/output control) 系统调用用于控制设备的特性。

实际应用场景

在Java中,通过JNI调用native方法来实现设备控制:

java
// Java设备控制示例
public class DeviceControl {
    // 通过JNI调用native方法
    private native int setDeviceParameter(int fd, int parameter);
    
    static {
        System.loadLibrary("devicecontrol");
    }
}

信息维护

信息维护系统调用用于获取和设置系统信息。

getpid()

getpid() 系统调用返回当前进程的进程ID。

实际应用场景

java
// Java获取进程信息示例
long pid = ProcessHandle.current().pid();
System.out.println("当前进程ID: " + pid);

通信

进程间通信(IPC)是操作系统提供的重要功能,主要通过以下系统调用实现:

pipe()

pipe() 系统调用用于创建一个管道,实现单向数据传输。

其他IPC机制

实际应用场景

java
// Java进程间通信示例(使用Socket)
ServerSocket server = new ServerSocket(8080);
Socket client = server.accept();

BufferedReader in = new BufferedReader(
    new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream(), true);

// 读取客户端数据
String message = in.readLine();
// 发送响应
out.println("Response: " + message);