1.运行Linux进程的创建程序,观察运行结果。 2.利用fork函数,编写程序。 3.用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容。利用wait( )来控制进程执行顺序。 4.用lockf( )来给每一个进程加锁,以实现进程之间的互斥。
时间: 2024-12-15 09:29:33 浏览: 7
Linux中使用C语言的fork()函数创建子进程的实例教程
在Linux中,创建并运行进程通常通过shell脚本或者直接在C/C++等编程语言中操作。以下是一个简化的示例,说明如何使用`fork()`、`exec()`和`wait()`函数:
1. **创建进程**:
使用`fork()`系统调用创建一个新的进程。主进程会返回0,而子进程会返回非零值。例如:
```c
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid = fork(); // 创建进程
if (pid == 0) { // 子进程
printf("I am child process.\n");
} else { // 父进程
printf("I am parent process, child's PID is %d.\n", pid);
}
return 0;
}
```
运行这个程序,你会看到两个消息分别来自父进程和子进程。
2. **Fork + Exec**:
在父进程中先调用`fork()`, 然后子进程可以用`exec()`系列函数(如`execvp()`)替换其当前执行环境,比如替换为另一个可执行文件:
```c
char* command[] = {"ls", "-l"};
execvp(command[0], command); // 替换子进程内容
printf("Child exiting with error.\n"); // 如果exec失败,会到达这里
```
父进程会在`exec`成功后退出,不会打印出"Child exiting with error"。
3. **等待子进程**:
使用`wait()`或`waitpid()`可以阻塞父进程直到子进程结束。例如:
```c
pid_t status;
waitpid(pid, &status, 0); // 等待子进程结束
printf("Child terminated with status %d.\n", WEXITSTATUS(status));
```
4. **进程间通信与互斥**:
`lockf()`用于对文件进行锁定,不适合用于进程间的互斥。对于进程间的同步和互斥,更常用的是信号量(`semaphore`)、互斥锁(`mutex`)或条件变量(`condition variable`)。例如,使用`sem_wait()`进行互斥:
```c
sem_t lock;
sem_init(&lock, 0, 1); // 初始化互斥锁
// 在需要访问共享资源的地方加上互斥锁
sem_wait(&lock);
// ...处理数据...
sem_post(&lock); // 释放锁
```
阅读全文