亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4810 | 回復(fù): 10
打印 上一主題 下一主題

multiprocessing hang問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-09-17 14:54 |只看該作者 |倒序?yàn)g覽
本帖最后由 linewer 于 2015-09-17 14:57 編輯
  1. #!/usr/bin/python

  2. import os, sys, time, atexit, errno
  3. import multiprocessing as mp
  4. from signal import signal
  5. from signal import SIGTERM
  6. from signal import SIGINT



  7. exit_flag = mp.Event()
  8. stdin =  "/dev/null"
  9. stdout = "/dev/null"
  10. #stderr = "/dev/null"
  11. stderr = "/tmp/test.log"
  12. pidfile ="/tmp/test.pid"

  13. def daemonize():
  14.     global stdin, stdout, stderr, pidfile

  15.     try:
  16.         pid = os.fork()
  17.         if pid > 0:
  18.             sys.exit(0)
  19.     except OSError, e:
  20.         sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
  21.         sys.exit(1)

  22.     os.chdir("/")
  23.     os.setsid()
  24.     os.umask(0)

  25.     try:
  26.         pid = os.fork()
  27.         if pid > 0:
  28.             sys.exit(0)
  29.     except OSError, e:
  30.         sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))
  31.         sys.exit(1)

  32.     sys.stdout.flush()
  33.     sys.stderr.flush()
  34.     si = file(stdin, 'r')
  35.     so = file(stdout, 'a+')
  36.     se = file(stderr, 'a+', 0)
  37.     os.dup2(si.fileno(), sys.stdin.fileno())
  38.     os.dup2(so.fileno(), sys.stdout.fileno())
  39.     os.dup2(se.fileno(), sys.stderr.fileno())

  40.     atexit.register(delpid)
  41.     pid = str(os.getpid())
  42.     file(pidfile, 'w+').write("%s\n" % pid)

  43. def delpid():
  44.     os.remove(pidfile)

  45. def handle_signal():
  46.     signal(SIGINT, handler)
  47.     signal(SIGTERM, handler)

  48. def handler(signum, frame):
  49.     global exit_flag
  50.     sys.stderr.write("get a signal: %s" % str(signum))
  51.     exit_flag.set()

  52. def start(run):
  53.     global pidfile

  54.     try:
  55.         pf = file(pidfile, 'r')
  56.         pid = int(pf.read().strip())
  57.         pf.close()
  58.     except IOError:
  59.         pid = None

  60.     if pid:
  61.         message = "pidfile %s already exists. Daemon already running!\n"
  62.         sys.stderr.write(message % pidfile)
  63.         sys.exit(1)

  64.     daemonize()
  65.     handle_signal()
  66.     run()

  67. def stop():
  68.     global pidfile
  69.     try:
  70.         pf = file(pidfile, 'r')
  71.         pid = int(pf.read().strip())
  72.         pf.close()
  73.     except IOError:
  74.         pid = None

  75.     if not pid:
  76.         message = "pidfile %s does not exist. Daemon not running!\n"
  77.         sys.stderr.write(message % pidfile)
  78.         return
  79.     try:
  80.         while True:
  81.             os.kill(pid, SIGTERM)
  82.             time.sleep(1)
  83.     except OSError, err:
  84.         if err.errno == errno.ESRCH:
  85.             if os.path.exists(pidfile):
  86.                 os.remove(pidfile)
  87.         else:
  88.             sys.exit(1)

  89. def restart(run):
  90.     stop()
  91.     start(run)


  92. def worker():
  93.     name = mp.current_process().name
  94.     message = "my name:%s,mypid is:%s\n"
  95.     sys.stderr.write(message % (name,os.getpid()))
  96.     while True:
  97.        if exit_flag.is_set():
  98.           break

  99. def test_start():
  100.     proc_pool = {}
  101.     proc_info = {}

  102.     for task in range(3):
  103.         print task
  104.         proc = mp.Process(target=worker)
  105.         proc.start()
  106.         proc_pool[proc.pid] = proc
  107.         ##debug info
  108.         sys.stderr.write('===pid %s: task %s===\n' % (proc.pid, proc.name))
  109.         proc_info[proc.pid] = task
  110.         #proc.join(timeout=1)


  111.     while True:
  112.         is_alive = False
  113.         for pid, proc in proc_pool.items():
  114.             #???
  115.             proc.join(timeout=1)
  116.             if proc.is_alive():
  117.                 is_alive = True
  118.             else:
  119.                 proc_pool.pop(pid)
  120.                 sys.stderr.write('===pid %s exit===\n' % (pid))
  121.                 if not exit_flag.is_set():
  122.                    #start another process for this task!(1)abort (2)???normal quit???
  123.                    proc1 = mp.Process(target=worker)
  124.                    proc1.start()
  125.                    proc_pool[proc1.pid]=proc1
  126.                    sys.stderr.write('===-pid %s: task %s-===\n' % (proc1.pid, proc_info[pid]))
  127.                    proc_info[proc1.pid]=proc_info[pid]
  128.                    proc_info.pop(pid)
  129.                    #proc1.join(timeout=1)

  130.                 #for k,v in proc_info.items():
  131.                 #      sys.stderr.write('new===pid %s: task %s===\n' % (k, v))
  132.                 #sys.stderr.write('~~~~~~~~~%s\n' % exit_flag.is_set())
  133.                
  134.         if not is_alive:
  135.             break

  136. def main():
  137.     if len(sys.argv) == 2:
  138.         if "start" == sys.argv[1]:
  139.                 start(test_start)
  140.         elif "stop" == sys.argv[1]:
  141.             stop()
  142.         elif "restart" == sys.argv[1]:
  143.             restart(run)            
  144.         else:
  145.             print "Unknown Command"
  146.             sys.exit(2)
  147.         sys.exit(0)
  148.     else:
  149.         print "usage: %s start|stop|restart" % sys.argv[0]
  150.         sys.exit(2)



  151. if __name__ == "__main__":
  152.     main()
復(fù)制代碼
如上簡(jiǎn)化代碼示例要實(shí)現(xiàn)的功能為: 某子進(jìn)程異常退出時(shí)能自動(dòng)重新生成一個(gè),正常運(yùn)行沒有問題,  但是在模擬測(cè)試時(shí)發(fā)現(xiàn),  在kill -9 某個(gè)子進(jìn)程或者某兩個(gè)時(shí), 偶爾會(huì)出現(xiàn)父進(jìn)程和其余子進(jìn)程掛起的問題,不能新生成一個(gè)新進(jìn)程(gdb看到是在sem_wait),MS exit_flag死鎖了,這個(gè)應(yīng)該怎么修正,哪位指導(dǎo)下,多謝!
#0  0x00000038e280d720 in sem_wait () from /lib64/libpthread.so.0
#1  0x00007f24dc80aef1 in ?? () from /usr/lib64/python2.6/lib-dynload/_multiprocessing.so
#2  0x000000357dad59e4 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#3  0x000000357dad6b8f in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0
#4  0x000000357dad7657 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0

論壇徽章:
16
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:3415-16賽季CBA聯(lián)賽之廣東
日期:2015-12-23 21:21:55青銅圣斗士
日期:2015-12-05 10:35:30黃金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日論壇發(fā)貼之星
日期:2015-11-18 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-11-18 06:20:002015亞冠之城南
日期:2015-11-10 19:10:492015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-10-28 18:47:282015亞冠之柏太陽神
日期:2015-08-30 17:21:492015亞冠之山東魯能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
2 [報(bào)告]
發(fā)表于 2015-09-18 14:11 |只看該作者
  1. class Event(object):

  2.     def __init__(self):
  3.         self._cond = Condition(Lock())
  4.         self._flag = Semaphore(0)

  5.     def is_set(self):
  6.         self._cond.acquire()
  7.         try:
  8.             if self._flag.acquire(False):
  9.                 self._flag.release()
  10.                 return True
  11.             return False
  12.         finally:
  13.             self._cond.release()

  14.     def set(self):
  15.         self._cond.acquire()
  16.         try:
  17.             self._flag.acquire(False)
  18.             self._flag.release()
  19.             self._cond.notify_all()
  20.         finally:
  21.             self._cond.release()

  22.     def clear(self):
  23.         self._cond.acquire()
  24.         try:
  25.             self._flag.acquire(False)
  26.         finally:
  27.             self._cond.release()

  28.     def wait(self, timeout=None):
  29.         self._cond.acquire()
  30.         try:
  31.             if self._flag.acquire(False):
  32.                 self._flag.release()
  33.             else:
  34.                 self._cond.wait(timeout)

  35.             if self._flag.acquire(False):
  36.                 self._flag.release()
  37.                 return True
  38.             return False
  39.         finally:
  40.             self._cond.release()
復(fù)制代碼
簡(jiǎn)單說說,以上是mp.Event代碼的set 和is_set方法,可以看出是都存在信號(hào)量的獲取的
所以你在中斷和非中斷都在調(diào)用Event的set和is_set  肯定存在死鎖的可能啊
盡量不要在中斷處理中調(diào)用信號(hào)量等處理

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2015-09-18 15:41 |只看該作者
多謝LS,我后來自己看了下,在父子進(jìn)程中,有些東西是繼承的(復(fù)制的),比如信號(hào)及信號(hào)處理函數(shù),這樣才導(dǎo)致死鎖現(xiàn)象. 程序的本意就是父進(jìn)程收到終止信號(hào)后,設(shè)置Event變量,子進(jìn)程判斷后退出, 因?yàn)樘幚聿缓?其實(shí)是在修別人的bug),導(dǎo)致子進(jìn)程同樣處理此信號(hào), 改成啟動(dòng)子進(jìn)程之前忽略信號(hào),之后恢復(fù),代碼如下,如果還有問題,歡迎斧正.
  1. #!/usr/bin/python

  2. import os, sys, time, atexit, errno
  3. import multiprocessing as mp
  4. from signal import signal
  5. from signal import getsignal
  6. from signal import SIGTERM
  7. from signal import SIGINT
  8. from signal import SIG_IGN



  9. exit_flag = mp.Event()
  10. stdin =  "/dev/null"
  11. stdout = "/dev/null"
  12. #stderr = "/dev/null"
  13. stderr = "/tmp/test.log"
  14. pidfile ="/tmp/test.pid"

  15. def daemonize():
  16.     global stdin, stdout, stderr, pidfile

  17.     try:
  18.         pid = os.fork()
  19.         if pid > 0:
  20.             sys.exit(0)
  21.     except OSError, e:
  22.         sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
  23.         sys.exit(1)

  24.     os.chdir("/")
  25.     os.setsid()
  26.     os.umask(0)

  27.     try:
  28.         pid = os.fork()
  29.         if pid > 0:
  30.             sys.exit(0)
  31.     except OSError, e:
  32.         sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))
  33.         sys.exit(1)

  34.     sys.stdout.flush()
  35.     sys.stderr.flush()
  36.     si = file(stdin, 'r')
  37.     so = file(stdout, 'a+')
  38.     se = file(stderr, 'a+', 0)
  39.     os.dup2(si.fileno(), sys.stdin.fileno())
  40.     os.dup2(so.fileno(), sys.stdout.fileno())
  41.     os.dup2(se.fileno(), sys.stderr.fileno())

  42.     atexit.register(delpid)
  43.     pid = str(os.getpid())
  44.     file(pidfile, 'w+').write("%s\n" % pid)

  45. def delpid():
  46.     os.remove(pidfile)

  47. def handle_signal():
  48.     signal(SIGINT, handler)
  49.     signal(SIGTERM, handler)

  50. def handler(signum, frame):
  51.     global exit_flag
  52.     sys.stderr.write("get a signal: %s" % str(signum))
  53.     exit_flag.set()

  54. def start(run):
  55.     global pidfile

  56.     try:
  57.         pf = file(pidfile, 'r')
  58.         pid = int(pf.read().strip())
  59.         pf.close()
  60.     except IOError:
  61.         pid = None

  62.     if pid:
  63.         message = "pidfile %s already exists. Daemon already running!\n"
  64.         sys.stderr.write(message % pidfile)
  65.         sys.exit(1)

  66.     daemonize()
  67.     handle_signal()
  68.     run()

  69. def stop():
  70.     global pidfile
  71.     try:
  72.         pf = file(pidfile, 'r')
  73.         pid = int(pf.read().strip())
  74.         pf.close()
  75.     except IOError:
  76.         pid = None

  77.     if not pid:
  78.         message = "pidfile %s does not exist. Daemon not running!\n"
  79.         sys.stderr.write(message % pidfile)
  80.         return
  81.     try:
  82.         while True:
  83.             os.kill(pid, SIGTERM)
  84.             time.sleep(1)
  85.     except OSError, err:
  86.         if err.errno == errno.ESRCH:
  87.             if os.path.exists(pidfile):
  88.                 os.remove(pidfile)
  89.         else:
  90.             sys.exit(1)

  91. def restart(run):
  92.     stop()
  93.     start(run)


  94. def worker():
  95.     name = mp.current_process().name
  96.     message = "my name:%s,mypid is:%s\n"
  97.     sys.stderr.write(message % (name,os.getpid()))
  98.     while True:
  99.        if exit_flag.is_set():
  100.           break

  101. def test_start():
  102.     proc_pool = {}
  103.     proc_info = {}
  104.     default_handler = getsignal(SIGTERM)
  105.     #Set signal handling of SIGTERM to ignore mode.
  106.     signal(SIGTERM, SIG_IGN)

  107.     for task in range(3):
  108.         print task
  109.         proc = mp.Process(target=worker)
  110.         proc.start()
  111.         proc_pool[proc.pid] = proc
  112.         ##debug info
  113.         sys.stderr.write('===pid %s: task %s===\n' % (proc.pid, proc.name))
  114.         proc_info[proc.pid] = task
  115.         #proc.join(timeout=1)

  116.     signal(SIGTERM, default_handler)

  117.     while True:
  118.         is_alive = False
  119.         for pid, proc in proc_pool.items():
  120.             #???
  121.             proc.join(timeout=1)
  122.             if proc.is_alive():
  123.                 is_alive = True
  124.             else:
  125.                 proc_pool.pop(pid)
  126.                 sys.stderr.write('===pid %s exit===\n' % (pid))
  127.                 if not exit_flag.is_set():
  128.                    #start another process for this task!(1)abort (2)???normal quit???
  129.                    signal(SIGTERM, SIG_IGN)
  130.                    proc1 = mp.Process(target=worker)
  131.                    proc1.start()
  132.                    signal(SIGTERM, default_handler)
  133.                    proc_pool[proc1.pid]=proc1
  134.                    sys.stderr.write('===-pid %s: task %s-===\n' % (proc1.pid, proc_info[pid]))
  135.                    proc_info[proc1.pid]=proc_info[pid]
  136.                    proc_info.pop(pid)
  137.                    #proc1.join(timeout=1)
  138.                    is_alive = True

  139.                 #for k,v in proc_info.items():
  140.                 #      sys.stderr.write('new===pid %s: task %s===\n' % (k, v))
  141.                 #sys.stderr.write('~~~~~~~~~%s\n' % exit_flag.is_set())
  142.                
  143.         if not is_alive:
  144.             break

  145. def main():
  146.     if len(sys.argv) == 2:
  147.         if "start" == sys.argv[1]:
  148.                 start(test_start)
  149.         elif "stop" == sys.argv[1]:
  150.             stop()
  151.         elif "restart" == sys.argv[1]:
  152.             restart(run)            
  153.         else:
  154.             print "Unknown Command"
  155.             sys.exit(2)
  156.         sys.exit(0)
  157.     else:
  158.         print "usage: %s start|stop|restart" % sys.argv[0]
  159.         sys.exit(2)



  160. if __name__ == "__main__":
  161.     main()
復(fù)制代碼

論壇徽章:
16
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:3415-16賽季CBA聯(lián)賽之廣東
日期:2015-12-23 21:21:55青銅圣斗士
日期:2015-12-05 10:35:30黃金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日論壇發(fā)貼之星
日期:2015-11-18 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-11-18 06:20:002015亞冠之城南
日期:2015-11-10 19:10:492015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-10-28 18:47:282015亞冠之柏太陽神
日期:2015-08-30 17:21:492015亞冠之山東魯能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
4 [報(bào)告]
發(fā)表于 2015-09-18 17:44 |只看該作者
依然有問題啊  建議不要在中斷去exit_flags.set

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2015-09-18 18:02 |只看該作者
tc1989tc 發(fā)表于 2015-09-18 17:44
依然有問題啊  建議不要在中斷去exit_flags.set


如果要在收到信號(hào)后,去設(shè)置exit_flags.set呢?設(shè)置個(gè)變量,放在父進(jìn)程主循環(huán)里做個(gè)判斷,然后設(shè)置exit_flags.set么? 或者還有別的好的方法么?

論壇徽章:
16
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:3415-16賽季CBA聯(lián)賽之廣東
日期:2015-12-23 21:21:55青銅圣斗士
日期:2015-12-05 10:35:30黃金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日論壇發(fā)貼之星
日期:2015-11-18 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-11-18 06:20:002015亞冠之城南
日期:2015-11-10 19:10:492015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-10-28 18:47:282015亞冠之柏太陽神
日期:2015-08-30 17:21:492015亞冠之山東魯能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
6 [報(bào)告]
發(fā)表于 2015-09-18 19:31 |只看該作者
回復(fù) 5# linewer


    把你的需求說出來吧  然后在看怎么解決

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2015-09-18 20:11 |只看該作者
tc1989tc 發(fā)表于 2015-09-18 19:31
回復(fù) 5# linewer

就是父進(jìn)程通過multiprocess啟動(dòng)幾個(gè)進(jìn)程(這些進(jìn)程做一些獨(dú)立的工作,比如請(qǐng)求web抓取頁面),在父進(jìn)程收到終止信號(hào)后,設(shè)置exit_flag.set, 子進(jìn)程內(nèi)的工作函數(shù)用到這個(gè)exit_flag做一些判斷(平滑關(guān)閉鏈接),然后退出, 父進(jìn)程會(huì)監(jiān)控子進(jìn)程的運(yùn)行情況,退出就新啟一個(gè).   整個(gè)程序放到cron中,定期執(zhí)行/終止

論壇徽章:
16
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:3415-16賽季CBA聯(lián)賽之廣東
日期:2015-12-23 21:21:55青銅圣斗士
日期:2015-12-05 10:35:30黃金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日論壇發(fā)貼之星
日期:2015-11-18 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-11-18 06:20:002015亞冠之城南
日期:2015-11-10 19:10:492015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-10-28 18:47:282015亞冠之柏太陽神
日期:2015-08-30 17:21:492015亞冠之山東魯能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
8 [報(bào)告]
發(fā)表于 2015-09-18 21:05 |只看該作者
sorry  現(xiàn)在你沒在子進(jìn)程中斷中調(diào)用exit_flag.set啦   
你后面貼的代碼 可以解決你的問題啦

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2015-09-18 21:35 |只看該作者
本帖最后由 linewer 于 2015-09-18 21:36 編輯
tc1989tc 發(fā)表于 2015-09-18 21:05
sorry  現(xiàn)在你沒在子進(jìn)程中斷中調(diào)用exit_flag.set啦   
你后面貼的代碼 可以解決你的問題啦


嗯, 生成子進(jìn)程之前我先忽略此信號(hào),之后恢復(fù).  感覺是修復(fù)了.   

晚上測(cè)試,發(fā)現(xiàn)一種情況,
  1.     while True:
  2.         is_alive = False
  3.         for pid, proc in proc_pool.items():
  4.             #???
  5.             proc.join(timeout=1)
  6.             if proc.is_alive():
  7.                 is_alive = True
  8.             else:
  9.                 proc_pool.pop(pid)
  10.                 sys.stderr.write('===pid %s exit===\n' % (pid))
  11.                 if not exit_flag.is_set():
  12.                    #start another process for this task!(1)abort (2)???normal quit???
  13.                    signal(SIGTERM, SIG_IGN)
  14.                    proc1 = mp.Process(target=worker)
  15.                    proc1.start()
  16.                    signal(SIGTERM, default_handler)
  17.                    proc_pool[proc1.pid]=proc1
  18.                    sys.stderr.write('===-pid %s: task %s-===\n' % (proc1.pid, proc_info[pid]))
  19.                    proc_info[proc1.pid]=proc_info[pid]
  20.                    proc_info.pop(pid)
  21.                    #proc1.join(timeout=1)
  22.                    is_alive = True    #這個(gè)如果注釋掉,在子進(jìn)程全異常退出時(shí),會(huì)生成新子進(jìn)程,但是父進(jìn)程按邏輯應(yīng)該退出,gdb看到是waitpid, 這個(gè)估計(jì)是等新子進(jìn)程,這應(yīng)該是邏輯錯(cuò)誤導(dǎo)致的???!!!

  23.                 #for k,v in proc_info.items():
  24.                 #      sys.stderr.write('new===pid %s: task %s===\n' % (k, v))
  25.                 #sys.stderr.write('~~~~~~~~~%s\n' % exit_flag.is_set())
  26.                
  27.         if not is_alive:
  28.             break
復(fù)制代碼
感覺同步碰上中斷處理確實(shí)是個(gè)麻煩事,而且是在修別人的寫的代碼

論壇徽章:
16
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:3415-16賽季CBA聯(lián)賽之廣東
日期:2015-12-23 21:21:55青銅圣斗士
日期:2015-12-05 10:35:30黃金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日論壇發(fā)貼之星
日期:2015-11-18 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-11-18 06:20:002015亞冠之城南
日期:2015-11-10 19:10:492015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-10-28 18:47:282015亞冠之柏太陽神
日期:2015-08-30 17:21:492015亞冠之山東魯能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
10 [報(bào)告]
發(fā)表于 2015-09-19 09:41 |只看該作者
看文檔如下描述:
When a process exits, it attempts to terminate all of its daemonic child processes.

大概原因如下:
你的子程序忽略的term信號(hào)處理,所有導(dǎo)致父進(jìn)程退出時(shí),去終止子進(jìn)程時(shí)候
會(huì)存在阻塞等到子進(jìn)程退出。
解決方法:
1.父進(jìn)程在創(chuàng)建完子進(jìn)程后在重新注冊(cè)你的信號(hào)處理
2.子進(jìn)程恢復(fù)系統(tǒng)默認(rèn)的信號(hào)處理 SIG_TERM
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP