做项目时,碰到需要Linux下C与python需要进行进程间的通信情况,特此记录
主要方法为通过管道进行重定向为标准输出,标准输入,来实现进程间的通信,采用双管道,后续通信可以采用信号来进行同步。
C code如下:
int fd1[2]; //重定向为标准输入
int fd2[2];/、重定向为标准输出
pipe(fd1);
pipe(fd2);
pid_t pid = fork();
if (pid == 0) //子进程
{
close(fd1[1]);
if(fd1[0] != STDIN_FILENO)
{
if(dup2(fd1[0], STDIN_FILENO) != STDIN_FILENO)
{
perror("dup2 error");
exit(-1);
}
}
close(fd2[0]);
if(fd2[1] != STDIN_FILENO)
{
if(dup2(fd2[1], STDIN_FILENO) != STDIN_FILENO)
{
perror("dup2 error");
exit(-1);
}
}
execl("./GDBServer_Tinyemu", NULL, NULL);
}
else if (pid > 0)
{
char * buf1 = "hello";
char buf[50] = {0};
int status;
write(fd1[1], buf1, strlen(buf1));
int readbytes = read(fd2[0], buf sizeof(buf))
printf("I have read %d Bytes, My content is %s\n", readbytes, buf);
waitpid(pid, &status, 0)
}
python code 如下:
data = sys.stdin.read(10);
sys.stdout.writelines(data + “world”)
注意 python code需在Linux下打包成可执行文件,可以通过pyinstaller xx.py来进行打包,上述GDBServer_Tinyemu即为python打包的exe文件,上述代码仅为测试通信code。 在Linux 编译运行C code 既可以打印出I have read xx Bytes, My content is hello world.
原创文章,码字不易,转载请标明出处