写在前面的话:本次课程作业其实就是对于书上第五章内容的改写,估计是书的作者想让我们体验一下实践的过程吧。
目录
5.1
1.1 题目描述
1.2 代码样例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
printf("hello world (pid:%d)\n", (int) getpid());
int x=3208;
int rc = fork();
if (rc < 0) { // fork failed; exit
fprintf(stderr, "fork failed\n");
exit(1);
} else if (rc == 0) { // child (new process)
x=4396;
printf("hello, I am child (pid:%d)\n, x=%d\n", (int) getpid(),x);
} else { // parent goes down this path (main)
x=2200;
printf("hello, I am parent of %d (pid:%d)\n, x=%d\n", rc, (int) getpid(),x);
}
return 0;
}
1.3 运行结果
5.3
3.1 题目描述
3.2 代码样例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int
main(int argc, char *argv[])
{
printf("hello world (pid:%d)\n", (int) getpid());
int rc = fork();
if (rc < 0) { // fork failed; exit
fprintf(stderr, "fork failed\n");
exit(1);
} else if (rc == 0) { // child (new process)
printf("hello, I am child (pid:%d)\n", (int) getpid());
printf("hello\n");
} else { // parent goes down this path (main)
int wc = wait(NULL);
printf("hello, I am parent of %d (wc:%d) (pid:%d)\n", rc,wc, (int) getpid());
printf("goodbye\n");
}
return 0;
}
3.3 运行结果
如果不使用wait(),可以使用signal()函数和alarm()函数结合使用,在父进程中设置一个定时器,当定时器时间到时,向父进程发送一个信号,父进程捕获信号就可以开始打印goodbye。
以下是代码样例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void sig_handler(int signum) {
printf("goodbye from parent\n");
exit(EXIT_SUCCESS);
}
int main() {
signal(SIGALRM, sig_handler); // 注册信号处理程序
pid_t pid = fork();
if (pid < 0) {
fprintf(stderr, "fork failed\n");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// child process
printf("hello from child\n");
exit(EXIT_SUCCESS);
} else {
// parent process
alarm(1); // 设置定时器
while(1); // 父进程进入一个无限循环,直到接收到信号
}
return 0;
}
运行结果:
5.5
5.1 题目描述
5.2 代码样例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int
main(int argc, char *argv[])
{
printf("hello world (pid:%d)\n", (int) getpid());
int rc = fork();
if (rc < 0) { // fork failed; exit
fprintf(stderr, "fork failed\n");
exit(1);
} else if (rc == 0) { // child (new process)
printf("hello, I am child (pid:%d)\n", (int) getpid());
} else { // parent goes down this path (main)
int wc = wait(NULL);
printf("hello, I am parent of %d (wc:%d) (pid:%d)\n", rc,wc, (int) getpid());
printf("wait() return: %d\n",(int) wc);
}
return 0;
}
5.3 运行结果
在父进程中调用wait()时,会返回子进程的PID;
5.4 代码样例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int
main(int argc, char *argv[])
{
printf("hello world (pid:%d)\n", (int) getpid());
int rc = fork();
if (rc < 0) { // fork failed; exit
fprintf(stderr, "fork failed\n");
exit(1);
} else if (rc == 0) { // child (new process)
int wc= wait(NULL);
printf("hello, I am child (pid:%d)\n", (int) getpid());
printf("wait() return: %d\n",(int) wc);
} else { // parent goes down this path (main)
printf("hello, I am parent of %d (pid:%d)\n", rc, (int) getpid());
}
return 0;
}
5.5 运行结果
在子进程中调用wait()时,会返回-1;
5.7
7.1 题目描述
7.2 代码样例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>
int
main(int argc, char *argv[])
{
printf("hello world (pid:%d)\n", (int) getpid());
int rc = fork();
if (rc < 0) { // fork failed; exit
fprintf(stderr, "fork failed\n");
exit(1);
} else if (rc == 0) { // child (new process)
close(STDOUT_FILENO);
printf("hello, I am child (pid:%d)\n", (int) getpid());
} else { // parent goes down this path (main)
int wc=wait(NULL);
printf("hello, I am parent of %d (pid:%d)\n", rc, (int) getpid());
}
return 0;
}
7.3 运行结果
可以看到此时子进程不会有任何输出