2014-12-16 3 views
5

मैंने setpgid() के लिए फ़ंक्शन का काम किया जब मैं इस फ़ंक्शन को निष्पादित करता हूं तो परिणाम अस्वीकार कर दिया जाएगा। तो मैंने रूट उपयोगकर्ता के रूप में लॉग इन किया है कि समय भी त्रुटि संदेश को प्रिंट करेगा क्योंकि अनुमति अस्वीकार कर दी गई है। तो कौन सा उपयोगकर्ता इस फ़ंक्शन का उपयोग कर सकता है। क्या कोई मुझे समझा सकता है?कौन सा उपयोगकर्ता setpgid() फ़ंक्शन का उपयोग कर सकता है?

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

    main() 
    { 
    printf("parent pid=%d\tpgid=%d\n",getpid(),getpgid(getpid())); 
    pid_t pid,pgid; 
    pgid=getpgid(getpid()); 
    if((pid=fork())==0) 
    { 
      printf("befor sessionchild pid=%d\tpgid=%d\n",getpid(),getpgid(getpid())); 
      sleep(5); 
      pid_t p; 
      printf("child pid=%d\tpgid=%d\n",getpid(),getpgid(getpid())); 
      if((p=fork())==0){ 
        sleep(2); 
        setsid(); 
        printf("child2 pid=%d\tpgid=%d\n",getpid(),getpgid(getpid())); 
        setpgid(getpid(),pgid); 
        perror("Error"); 
        printf("after setting group id child2 pid=%d\tpgid=%d\n",getpid(),getpgid(getpid())); 
      } 
      wait(0); 
      exit(0); 
    } 
    exit(0); 
    }           
+0

मुझे पूरा यकीन नहीं है, लेकिन हो सकता है कि सत्र आईडी से संबंधित कुछ हो? –

उत्तर

0

ऐसा नहीं है कि आपको त्रुटि प्रबंधन कैसे करना चाहिए।

चेक वापसी मान की हर API कॉल, त्रुटियों की तलाश में।

हैं (और केवल यदि) एक त्रुटि हुई है, तो आप errno की जाँच करें और perror उपयोग करना चाहिए। यह आपके perror() बयान से पहले हाल ही में कॉल नहीं किया गया हो सकता है -

2

सबसे पहले, तुम सच में अपने कार्य के रिटर्न मान कॉल इससे पहले कि आप perror() फोन की जांच करने, अन्यथा आप नहीं जानते कि जो अपने कॉल कि विफल की जरूरत है वह असफल रहा। कोड की तरह कुछ किया जाना चाहिए:

if (setpgid(getpid(),pgid) != 0) { 
    perror("setpgid"); 
} 

तो यह वास्तव में, यहाँ setpgid() यह काम नहीं करता है क्या docs कहते है:

EPERM का प्रयास किया गया था एक प्रक्रिया में एक प्रक्रिया स्थानांतरित करने के लिए एक अलग सत्र में समूह , या में से किसी एक की प्रक्रिया समूह आईडी को बदलने के लिए कॉलिंग प्रक्रिया के बच्चे और बच्चे सत्र में थे, या सत्र नेता (setpgid() की प्रक्रिया समूह आईडी को बदलने के लिए, setpgrp())।

तो ऐसा लगता है कि आप अपने बच्चे की प्रक्रिया setsid() पर कॉल करने के बाद वर्णित इस पहले मामले को मार रहे हैं।

job control के बारे में glibc दस्तावेज़ इस विषय पर कुछ पढ़ने की सामग्री है।

संबंधित मुद्दे