int main() {
pid_t child_pid;
child_pid=fork();
if(child_pid==-1) {
perror("fork");
return 1;
}
if(child_pid==0) {
printf("This is the child process,pid=%d\n",getid());} else {
printf("This is the parent process,pid=%d,child_pid=%d\n",getpid(),child_pid)
}
return 0;
}
试获取信号量的锁,若获取成功则可以访问该资源,否则需要等待。而当一个线程释放该共享资源时,需要将信号量的计数器加一,以便其他线程可以进行访问。
sem_wait(&mutex);
sem_post(&mutex);
pthread_create(&threads[i],NULL,thread_function,&thread_ids[i]);
#define BUFFER_SIZE 25
int main() {
int fd[2];
char write_msg[BUFFER_SIZE] = "Hello, world!";
char read_msg[BUFFER_SIZE];
pid_t pid;
if (pipe(fd) == -1) { // 创建匿名管道
fprintf(stderr, "Pipe failed");
return 1;
}
pid = fork(); // 创建子进程
if (pid < 0) { // 创建子进程失败
fprintf(stderr, "Fork failed");
return 1;
} else if (pid == 0) { // 子进程
close(fd[1]); // 关闭写端口
read(fd[0], read_msg, BUFFER_SIZE); // 从管道中读取数据
printf("Child process received message: %s\n", read_msg);
} else { // 父进程
close(fd[0]); // 关闭读端口
write(fd[1], write_msg, BUFFER_SIZE); // 向管道中写入数据
printf("Parent process sent message: %s\n", write_msg);
}
return 0;
}
producer(){
while(1){
produce an item in nextp; //生产数据
P(empty); //(要用什么P一下) //获取空缓冲区单元
P(mutex); //互斥,进入临界区
add nextp to buffer; //将数据放入缓冲区
V(mutex); //离开临界区,释放互斥信号量
V(full); //满缓冲区数加1,相当于放入缓冲区了,让缓冲区的数加1
}
}consumer(){
while(1){
P(full);//获取满缓冲区单元,如果没有数据就等待
P(mutex);//进入缓冲区
remove an item from buffer;//从缓冲区取出数据
V(mutex);//离开临界区,释放互斥信号量
V(empty);//空缓冲区数加1
consume the item;//消费数据
}
}
一共输出 6 个。
首先程序一开始,bash产生一个进程 P0 执行此程序,P0 进入程序。
当 i=0 时:
fork() 产生一个子进程P1,同时它自己输出一个’!'。P1 继承 P0 的诸如环境变量,P1 首先会输出一个 ‘!’。
当 i=1 ,会继续执行 for 循环— P1 先 fork() 出一个子进程 P2,同时再输出一个 ‘!’。
P2 进程为 P1 的子进程,它会复制其父进程P2的指令,变量值,程序调用栈,环境变量,缓冲区等,它会输出一个 ‘!’。
此时 P0 进入程序后,当 i=1 时,fork() 产生另一个它的子进程P3,同时输出一个 ‘!’。P3 同样会输出一个 ‘!’。
1.管道(Pipe):一种单向通信机制,只能在父子进程或兄弟进程之间使用。
2.命名管道(Named Pipe):类似于管道,但可以在不同进程之间使用。
3.消息队列(Message Queue):可以在不同进程之间传递消息,支持多对多通信。
4.共享内存(Shared Memory):可以在不同进程之间共享同一块物理内存,速度很快。
5.信号量(Semaphore):可以用来控制对共享资源的访问,避免竞争条件的发生。
6.套接字(Socket):可以在不同主机之间进行网络通信。
7.信号(Signal):可以用来通知进程某个事件已经发生。
1、
临界区是指并发进程中涉及共享变量的()。
A、程序段
2、
下列有关fork()函数返回值说法错误的是()
D、大于0返回值为父进程的PID号
3、
下面程序的输出是什么()
D、不确定
#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv){
if(fork() == 0){
printf("hello");
}else{
printf("world");
}
return 0;
}
4、
下面说法不正确的是( )
C、进程创建一般由create函数完成
5、
关于SIGCHLD信号说法错误的是()
D、由于SIGCHLD信号默认方式是忽略,所以在代码中不需要手动设置SIGCHLD信息的处理方式,也不会产生僵尸进程
6、
下列哪种通信方式只能用于具有亲缘关系进程之间的通信()
A、匿名管道
8. (简答题)
1、
比较文件的差异要用到的命令是以下哪一种?(单选)
A、diff
2、
存放设备文件的相关文件目录是?(单选)
A、/dev
3、
rm命令表示什么?(单选)
D、文件删除命令
4、
在openEuler系统中,用户文件描述符0表示?(单选)
B、标准输入设备文件描述符
5、
在使用 mkdir命令创建新的目录时,在其父目录不存在时先创建父目录的选项是?(单选)
C、-p
6、
执行命令“chmod o+rw myfile”后,myfile文件的权限变化为?(单选)
B、其他用户可读写myfile文件