linux C编程 下发指令抓回显 子进程执行时将父进程先挂起
时间: 2023-09-12 12:05:55 浏览: 84
实现这个功能可以使用Linux的进程间通信机制,比如管道(pipe)或共享内存(shared memory)等。
使用管道的方法如下:
1. 创建管道,可以使用pipe函数,它会返回两个文件描述符,一个用于读,一个用于写。
2. 创建子进程,使用fork函数。
3. 在子进程中,关闭读端文件描述符,将标准输出重定向到写端文件描述符。
4. 在父进程中,关闭写端文件描述符,使用读端文件描述符读取子进程的输出。
5. 在父进程中,使用waitpid函数等待子进程结束。
6. 在父进程中,将读取到的子进程的输出打印到屏幕。
代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#define BUF_SIZE 1024
int main()
{
int pipefd[2];
pid_t pid;
char buf[BUF_SIZE];
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid == 0) { // 子进程
close(pipefd[0]); // 关闭读端
dup2(pipefd[1], STDOUT_FILENO); // 标准输出重定向到写端
execl("/bin/ls", "ls", "-l", NULL);
exit(EXIT_FAILURE);
} else { // 父进程
close(pipefd[1]); // 关闭写端
while (read(pipefd[0], buf, BUF_SIZE) > 0) { // 读取子进程的输出
printf("%s", buf);
}
waitpid(pid, NULL, 0); // 等待子进程结束
close(pipefd[0]);
exit(EXIT_SUCCESS);
}
}
```
使用共享内存的方法类似,只需要将管道替换为共享内存即可。但是共享内存需要注意同步问题,需要使用信号量等机制进行同步。
阅读全文