逆向 | linux c fork子进程
逆向 | linux c fork子进程
参考文章:
https://blog.csdn.net/whatday/article/details/112093358
创建子进程
代码如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
printf("@ test for subprocess \n");
pid_t pid;
int n;
pid = fork();
if (pid < 0){
perror("fork failed");
exit(1);
}
if (pid == 0){
printf("> from child! pid: %d, ppid: %d \n", getpid(), getppid());
}else{
// printf("> from father! pid: %d, ppid: %d \n", getpid(), getppid());
printf("> from father! pid: %d \n", getpid());
sleep(1);
}
return 0;
}
如果不加sleep(),可能会出现父进程比子进程先退出的情况,子进程会被upstart这个进程收养,具体参考下面这个文章:
https://blog.csdn.net/Leafage_M/article/details/70273624
运行截图:
exec 执行别的进程
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
printf("@ test for subprocess \n");
pid_t pid;
int n;
pid = fork();
if (pid < 0){
perror("fork failed");
exit(1);
}
if (pid == 0){
printf("> from child! pid: %d, ppid: %d \n", getpid(), getppid());
char *argv[ ]={"ls", "-al", ".", NULL};
char *envp[ ]={"PATH=/bin", NULL};
if(execve("/bin/ls", argv, envp) < 0)
{
printf("subprocess error");
exit(1);
}
// 子进程要么从 ls 命令中退出,要么从上面的 exit(1) 语句退出
// 所以代码的执行路径永远也走不到这里,下面的 printf 语句不会被执行
printf("You should never see this message.");
}else{
printf("> from father! pid: %d \n", getpid());
sleep(1);
}
return 0;
}
运行截图:
通过pipe与子进程交互读写:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
char toExec[] = "/bin/python3";
char *argv[] = {toExec, "./subprocesstest.py", NULL};
char *envp[]={"PATH=/bin", NULL};
int main(){
printf("@ test for subprocess \n");
pid_t pid;
int child_output[2];
int child_input[2];
int status;
// create pipe for two process
if (pipe(child_output) < 0) {
perror("pipe err \n");
exit(1);
}
if (pipe(child_input) < 0) {
perror("pipe err \n");
exit(1);
}
// create child
pid = fork();
if (pid < 0){
perror("fork failed");
exit(1);
}
// child
if (pid == 0){
//将子进程的输出由标准输出重定向到 cgi_ouput 的管道写端上
dup2(child_output[1], 1);
//将子进程的输出由标准输入重定向到 cgi_ouput 的管道读端上
dup2(child_input[0], 0);
//关闭 ouput 管道的读端与input 管道的写端
close(child_output[0]);
close(child_input[1]);
if(execve(toExec, argv, envp) < 0)
{
printf("subprocess execve error");
exit(1);
}
}
// father
else{
//父进程则关闭了output管道的写端和 input 管道的读端
close(child_output[1]);
close(child_input[0]);
//然后从 child_output 管道中读子进程的输出
char c;
printf("recv from child: \n");
while (read(child_output[0], &c, 1) > 0){
printf("%c", c);
}
//关闭管道
close(child_output[0]);
close(child_input[1]);
//等待子进程的退出
waitpid(pid, &status, 0);
}
return 0;
}
本文来自博客园,作者:Mz1,转载请注明原文链接:https://www.cnblogs.com/Mz1-rc/p/16272746.html
如果有问题可以在下方评论或者email:mzi_mzi@163.com