关于打印过程中强制移除打印机的处理

在打印过程中,强制拔除打印机会出现如下状况:

Hpijs会输出这个信息:unable to send DeviceStatus: Bad file descriptor: hplip_api.c 641

一直循环。

查得

$ man errno | grep "Bad file descriptor"

       EBADF           Bad file descriptor (POSIX.1)

解决方案1

目前改善的是获取hpijspid,将其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;

}

 

 

解决方案2:(最终采用的方案

当出现这种情况的时候将自己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

测试成功,在输出一行 unable to send DeviceStatus: Bad file descriptor: hplip_api.c 642后,直接hpijs毙命。

 

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精神。

你可能感兴趣的:(关于打印过程中强制移除打印机的处理)