在打印过程中,强制拔除打印机会出现如下状况:
Hpijs会输出这个信息:unable to send DeviceStatus: Bad file descriptor: hplip_api.c 641
一直循环。
查得
$ man errno | grep "Bad file descriptor"
EBADF Bad file descriptor (POSIX.1)
目前改善的是获取hpijs的pid,将其kill 9之后可以结束不停的打印。但是也会打印几百行后停止,所以优化的时候也要将hpijs中这句打印去掉。
static int print_stop_print(struct print_device_t* dev) {
int ret = EXIT_FAILURE;
// hpijs or ijsgutenprint pid.
pid_t pid = getPidByName("hpijs");
if(pid != 0)
if(kill(pid, 9) == 0)
ret = EXIT_SUCCESS;
return ret;
}
当出现这种情况的时候将自己kill掉。输出一次信息,然后将自己kill掉。
if(errno == EBADF)
exit(-1); // kill(getpid(), 9);
1.exit(-1);测试结果:
GPL Ghostscript 9.04 (2011-08-05) Copyright (C) 2011 Artifex Software, Inc. All rights reserved. This software comes with NO WARRANTY: see the file PUBLIC for details. Processing pages 1 through 1. Page 1 unable to write to output, fd=6, count=4096: Input/output error unable to write to output, fd=6, count=4096: No such device unable to write to output, fd=6, count=4096: No such device unable to write to output, fd=6, count=4096: No such device unable to write to output, fd=6, count=4096: No such device unable to send DeviceStatus: Bad file descriptor: hplip_api.c 642 Error: /ioerror in --showpage-- Operand stack: 1 true Execution stack: %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1910 1 3 %oparray_pop 1909 1 3 %oparray_pop 1893 1 3 %oparray_pop --nostringval-- --nostringval-- 2 1 1 --nostringval-- %for_pos_int_continue --nostringval-- --nostringval-- 1793 0 9 %oparray_pop --nostringval-- --nostringval-- Dictionary stack: --dict:1161/1684(ro)(G)-- --dict:1/20(G)-- --dict:82/200(L)-- --dict:82/200(L)-- --dict:108/127(ro)(G)-- --dict:291/300(ro)(G)-- --dict:23/30(L)-- --dict:6/8(L)-- --dict:22/40(L)-- Current allocation mode is local Last OS error: 32 GPL Ghostscript 9.04: Unrecoverable error, exit code 1 |
2.kill(getpid(), 9)的测试结果:
测试为无效。
sed命令:
1).添加#include <errno.h>
sed -i '38s/#include "hplip_api.h"/#include <errno.h>\n#include "hplip_api.h"/' hplip_api.c
2.)添加
if(errno == EBADF)
exit(EXIT_FAILURE);
sed -i '643s/goto mordor;/if(errno == EBADF)\n exit(-1);\n goto mordor;\n/' hplip_api.c
hpijs是一个服务,可以在像vold或者其它一样启动和停止。这样就更符合Android精神。