代码:#include<stdio.h> #include<signal.h> #include<unistd.h> #include<stdlib.h> void waiting(),stop(); int wait_mark; main() { int p1,p2; signal(SIGINT,stop); while((p1=fork())== -1); if(p1>0) {① while((p2=fork())== -1); if(p2>0) {② wait_mark=1; waiting(0); kill(p1,10); kill(p2,12); wait(); wait(); printf("parent proces is killed!\n"); exit(0); } else { wait_mark=1; signal(12,stop); waiting(); lockf(1,1,0); printf("child process 2 is killed by parent!\n"); lockf(1,0,0); exit(0); } } else { wait_mark=1; signal(10,stop); waiting(); lockf(1,1,0); printf("child process 1 is killed by parent!\n"); lockf(1,0,0); exit(0); } } void waiting() { while(wait_mark!=0); } void stop() { wait_mark=0; }。如果把signal(SIGINT, stop)放在程序中的①号和②号位置,结果会怎样?并分析原因。
时间: 2024-04-06 16:28:40 浏览: 41
如果将signal(SIGINT, stop)放在程序中的①号位置,那么当父进程收到SIGINT信号时,会立即结束程序,导致子进程1和子进程2都无法执行完毕,产生僵尸进程。原因是在父进程执行到这里时,子进程1还未被创建,因此子进程1的进程ID还未被获取,kill(p1,10)会向不存在的进程发送信号,导致程序异常结束。
如果将signal(SIGINT, stop)放在程序中的②号位置,那么当父进程收到SIGINT信号时,会先结束子进程2,再结束子进程1,最后结束父进程。原因是在父进程执行到这里时,子进程1和子进程2都已经被创建,因此kill(p1,10)和kill(p2,12)都会向有效的进程发送信号,子进程2先收到信号结束,然后子进程1结束,最后父进程结束。
相关问题
前6行程序输出。 C/C++ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <signal.h>
这段程序是C/C++代码,包含了5个头文件。第一个头文件<stdio.h>提供了标准输入输出函数,第二个头文件<stdlib.h>提供了一些常用的函数和类型定义,第三个头文件<sys/types.h>定义了系统调用所需的数据类型,第四个头文件<unistd.h>提供了一些通用的系统服务函数,最后一个头文件<signal.h>提供了信号处理的相关函数和数据类型。
这段代码并没有输出语句,所以程序不会有任何输出。
不用<stdlib.h>
如果你不想使用 `<stdlib.h>` 文件,那是因为 `stdlib.h` 包含了一些标准库函数,比如内存管理函数、随机数生成等。如果你的项目不依赖这些特定功能,可以跳过引用。例如,如果你想避免使用 `malloc()` 和 `free()` 函数,可以手动分配和释放内存,或者使用 C 标准库提供的 `calloc()` 或者数组来代替动态内存。
在不包含 `<stdlib.h>` 的情况下,你需要记住一些常用但不在头文件中的函数,比如:
1. **printf** 和 **scanf**: 这些用于输入输出的基本格式化函数,它们位于 `<stdio.h>` 文件中。
2. **strlen**: 计算字符串长度,位于 `<string.h>` 文件中。
3. **exit**: 结束程序执行,一般用于异常退出,位于 `<unistd.h>` 或 `<csignal.h>` 中(取决于环境)。
4. **字符常量和整型数据类型**: 都在 `<ctype.h>` 或 `<stdint.h>` 中定义。
如果你仅需要基本的数学运算和控制流,可以不用 `stdlib.h`。但如果你的程序需要更复杂的功能,可能需要适时地引入其他头文件。记得在每个文件开始处声明你想要使用的函数,比如:
```c
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello";
int len = strlen(str); // 使用 strlen 不需要 stdlib
printf("String length: %d\n", len);
// 其他不涉及 stdlib 的操作...
return 0;
}
```
在这种情况下,务必检查哪些函数确实不需要 `<stdlib.h>` 提供,并相应地调整你的代码。
阅读全文