簡體   English   中英

fork()反復失敗

[英]fork() failing repeatedly

我試圖使用fork創建一個子進程,但是它反復返回-1 ,我試圖找到原因,然后我想到了:

Fork() will fail and no child process will be created if:
[EAGAIN]           The system-imposed limit on the total number of pro-
                   cesses under execution would be exceeded.  This limit
                   is configuration-dependent.

[EAGAIN]           The system-imposed limit MAXUPRC (<sys/param.h>) on the
                   total number of processes under execution by a single
                   user would be exceeded.

[ENOMEM]           There is insufficient swap space for the new process. 

現在我不知道如何檢查第一點和第三點,但是在查看MAXUPRCMAXUPRC -我研究了sys / param.h

//<sys/param.h>
#define MAXUPRC     CHILD_MAX   /* max simultaneous processes */

這里提到了CHILD_MAXunistd.h ):

//<unistd.h> - DEFINED IN MY SYSTEM
#define _SC_CHILD_MAX            2 

CHILD_MAX-_SC_CHILD_MAX每個用戶ID的最大同時進程數。 不得小於_POSIX_CHILD_MAX(25)。

現在,我無法確定是否將_SC_CHILD_MAX保持小於25是原因,還是我必須研究第一和第三原因(它們很難檢查,因為系統是訪問權限受限的Z / OS ,並且我沒有太多想法關於它)。

perror(""); 不打印任何內容,而errno打印655360。

  #include<stdio.h>
  #include<errno.h>
  #include<unistd.h>
  #include<stdlib.h>

   int main()
   {
       long int prc_id;

       prc_id=fork();

       if(prc_id ==0)
          calling_child();        
       else if(prc_id <0)
       {
           printf("errno - %d\n",errno); 
           printf("failed %d\n",prc_id);
           exit(0);
       }

      return 0;
 }

上面的代碼運行良好,並在我自己的筆記本電腦(centos)上創建了一個子進程,但是在開發環境中,我認為存在一些限制。

由於返回的prc_id為-1,因此永遠不會調用prc_id (即使在進入函數時也不打印第一個打印語句)。

我將示例程序復制到運行z / OS版本2.3的z / OS系統中,並做了一個較小的增強,因為您省略了calling_child函數(已更新,為SC_MAX_CHILD添加了sysconf()值):

  #include<stdio.h>
  #include<errno.h>
  #include<unistd.h>
  #include<stdlib.h>

   int main()
   {
       long int prc_id;
       printf("SC_CHILD_MAX = %d\n", sysconf(_SC_CHILD_MAX));

       prc_id=fork();

       if(prc_id ==0)
          calling_child();        
       else if(prc_id <0)
       {
           printf("errno - %d\n",errno); 
           printf("failed %d\n",prc_id);
           exit(0);
       }

      return 0;
     } 

   static void calling_child(void)
   {
      printf("Hello from PID %x\n", getpid());
      return;
   }

我將代碼放在一個名為test2.c的文件中,並使用以下shell命令對其進行了構建: c99 -o test2 -g test2.c

它可以干凈地編譯,並且我可以毫無問題地運行它。 它產生以下輸出:

SC_CHILD_MAX = 32767
Hello from PID 40100b2

您的構建或執行環境很可能配置不正確。 在我的基本系統上,它絕對可以正常工作,而且我不必做任何異常的事情就可以運行它。

一些小提示...

您如何進入z / OS UNIX shell? 如果要登錄到TSO,然后運行ISPF Shell或OMVS命令,則可能更喜歡僅通過SSH進入z / OS系統。 我通常會發現這是最干凈的批處理環境。

第二件事是您可能想仔細檢查您的C / C ++環境。 IBM XLC編譯器內置了一些良好的調試功能-試試man C99 (或您使用的任何方言)並進行閱讀。

第三件事是IBM在z / OS中包含了dbx調試器,因此,如果您真的遇到問題,只需嘗試在dbx下運行可執行文件,就可以一次遍歷程序行。

至於那些ERRNO等等,別忘了還要查看__errno2()值-它們通常具有非常特殊的原因代碼以及更常見的錯誤。 例如,您的z / OS安全管理員當然可以做一些事情來限制您對z / OS UNIX函數的使用-這將在__errno2()值中清楚地顯示出來。

堅持使用-如果您了解UNIX或Linux,那么如果花一點時間來學習基礎知識,那么從使用Shell到進行編碼的所有技能幾乎都會100%轉移到z / OS。

如果您一直在使用fork (2),則可能已經用完了對進程可用的進程限制,請參閱ulimit for shell:

$ help ulimit | grep process
Ulimit provides control over the resources available to processes
    -d      the maximum size of a process's data segment
    -l      the maximum size a process may lock into memory
    -u      the maximum number of user processes

如果是這樣,注銷並再次登錄將解決該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM