int main(int argc, char *argv[]) { int pid = fork(); if(pid == 0) { runBroadcast(1, S1, S1Len); } else { pid = fork(); if(pid == 0) { runBroadcast(2, S2, S2Len); } else { runBroadcast(3, S3, S3Len); } } }
时间: 2024-02-14 11:23:26 浏览: 142
这段代码是一个简单的并发程序,使用了 fork() 函数创建了三个子进程,每个子进程执行 runBroadcast() 函数,传入不同的参数。这个程序的目的是同时广播三个消息 S1、S2、S3。
具体来说,第一个子进程广播 S1 消息,第二个子进程广播 S2 消息,第三个子进程广播 S3 消息。这三个子进程是并发执行的,它们之间相互独立,不会相互干扰。
值得注意的是,fork() 函数会在当前进程中创建一个新的子进程,新的子进程会完全复制当前进程的所有资源,包括代码、数据、堆栈、文件描述符等等。因此,在这段代码中,每个子进程都会独立地运行 runBroadcast() 函数,不会相互影响。
相关问题
int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s <semaphore>\n", argv[0]); exit(1); } sem_t *sem = sem_open(argv[1], O_CREAT, 0666, 1); if (sem == SEM_FAILED) { perror("sem_open"); exit(1); } pid_t pid = fork(); if (pid < 0) { perror("fork"); exit(1); } else if (pid == 0) { // Child process sem_wait(sem); char *file = "MYFILE1"; int fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (fd < 0) { perror("open"); exit(1); } 写注释
好的,以下是这段代码的注释:
```
int main(int argc, char *argv[]) {
if (argc != 2) { // 如果命令行参数不是两个,输出使用说明并退出程序
printf("Usage: %s <semaphore>\n", argv[0]);
exit(1);
}
sem_t *sem = sem_open(argv[1], O_CREAT, 0666, 1); // 打开或创建一个命名信号量
if (sem == SEM_FAILED) { // 如果打开或创建信号量失败,输出错误信息并退出程序
perror("sem_open");
exit(1);
}
pid_t pid = fork(); // 创建一个子进程
if (pid < 0) { // 如果创建子进程失败,输出错误信息并退出程序
perror("fork");
exit(1);
} else if (pid == 0) { // 如果是子进程
sem_wait(sem); // 等待信号量
char *file = "MYFILE1"; // 文件名
int fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666); // 打开或创建一个文件
if (fd < 0) { // 如果打开或创建文件失败,输出错误信息并退出程序
perror("open");
exit(1);
}
// 在文件中写入数据
const char *msg = "Hello, world!\n";
write(fd, msg, strlen(msg));
close(fd); // 关闭文件
sem_post(sem); // 发送信号量
exit(0); // 子进程结束
} else { // 如果是父进程
wait(NULL); // 等待子进程结束
sem_unlink(argv[1]); // 删除信号量
exit(0); // 父进程结束
}
}
```
这段代码的功能是创建一个子进程,在子进程中打开或创建一个文件,并在文件中写入数据。父进程等待子进程结束后,删除信号量并退出程序。
#include <unistd.h> #include <sys/types.h> #include <stdio.h> #include <errno.h> int main(int argc,char **argv) { pid_t pid,old_ppid,new_ppid; pid_t child,parent; parent=getpid(); if((child=fork())<0){ printf(“fork error”); exit(1); }else if(child==0){ /*此时是子进程被调度运行*/ old_ppid=getppid(); sleep(2); new_ppid=getppid(); } else { sleep(1); exit(0); /*父进程退出,此时子进程 会被只派一个新的父进程PID,值为1*/ } printf("Original parent:%d\n",parent); printf("Child:%d\n",getpid()); printf("Child's old ppid:%d\n",old_ppid); printf("Child's new ppid:%d\n",new_ppid); exit(0);}
这是一个简单的进程创建和进程间通信的程序,使用了fork()和getppid()函数。
程序先创建了一个父进程,然后通过fork()函数创建了一个子进程。子进程在运行时先用getppid()函数获取其父进程的PID,然后睡眠2秒钟,再次获取其父进程的PID。父进程在创建子进程后睡眠1秒钟,然后退出。
程序输出了原始父进程的PID、子进程的PID、子进程的旧父进程的PID和子进程的新父进程的PID。
当子进程运行时,它的父进程已经退出,所以它的新父进程的PID为1。
阅读全文