t# fork与逻辑运算
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
fork();
fork()&&fork()||fork();
fork();
printf("main\n");
}
1.A&&B,若A = 0,则不会执行B。
A||B,若A != 0,则不会执行B。
2.特别提示:A&&B||C,当A=0时仅仅不执行B,但还会执行C。
3.如图所示,为fork()&&fork()||fork()的流程图。
由于fork()一次调用,两次返回的特性,无条件限制时fork()乘2,在此代码中表达式之前,之后各有一个fork(),故一共有5*4=20个程 序,除去原始的一个,则还余下新建的19个。
缓存的问题
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void)
{
int i;
for(i=0; i<2; i++){
fork();
printf("-");
}
wait(NULL);
wait(NULL);
return 0;
}
1.会打印8个“-”,因为没有\n,所以不会直接刷新缓存输出到设备上,在fork时,子进程会复制到父进程的缓存内容,导致多输出两个“-”。
main函数:
/*
* forks.c - Examples of Unix process control
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
int main(int argc, char *argv[])
{
int option = 0;
if (argc > 1)
option = atoi(argv[1]);
switch(option) {
case 0: fork0();
break;
case 1: fork1();
break;
case 2: fork2();
break;
case 3: fork3();
break;
case 4: fork4();
break;
case 5: fork5();
break;
case 6: fork6();
break;
case 7: fork7();
break;
case 8: fork8();
break;
case 9: fork9();
break;
case 10: fork10();
break;
case 11: fork11();
break;
case 12: fork12();
break;
case 13: fork13();
break;
case 14: fork14();
break;
case 15: fork15();
break;
case 16: fork16();
break;
case 17: fork17();
break;
default:
printf("Unknown option %d\n", option);
break;
}
return 0;
}
fork0
/*
* fork0 - The simplest fork example
* Call once, return twice
* Creates child that is identical to parent
* Returns 0 to child process
* Returns child PID to parent process
*/
void fork0()
{
if (fork() == 0) {
printf("Hello from child\n");
}
else {
printf("Hello from parent\n");
}
}
1.调用一次,返回两次:fork函数被父进程调用一次,返回的是新创建的子进程和父进程。
2.并发:父进程和子进程独立运行,结果显示在我的系统上为父进程先完成printf,输出Hello from parent,子进程后完成printf,输出 Hello from child,但是在另外的系统上可能正好相反。
进程图如下所示:
fork1
/*
* fork1 - Simple fork example
* Parent and child both run same code
* Child starts with identical private state
*/
void fork1()
{
int x = 1;
pid_t pid = fork();
if (pid == 0) {
printf("Child has x = %d\n", ++x);
}
else {
printf("Parent has x = %d\n", --x);
}
printf("Bye from process %d with x = %d\n",