লিনাক্স কি স্বয়ংক্রিয়ভাবে বিমূর্ত ডোমেন সকেটগুলি পরিষ্কার করে?


15

ডেমনগুলির জন্য আরও ভাল লক সরবরাহ করার বিষয়ে স্ট্যাকওভারফ্লোতে একটি দুর্দান্ত উত্তর রয়েছে ( এডুয়ার্ডো ফ্ল্যুরির কাছ থেকে সংশ্লেষিত ) যা ডিমনগুলির জন্য সাধারণ পিআইডি ফাইল লক ব্যবস্থার উপর নির্ভর করে না। পিআইডি লক ফাইলগুলি কেন কখনও কখনও সমস্যার কারণ হতে পারে সে সম্পর্কে সেখানে প্রচুর ভাল মন্তব্য রয়েছে, সুতরাং আমি সেগুলি এখানে পুনরায় সংশোধন করব না।

সংক্ষেপে, সমাধানটি লিনাক্স অ্যাবস্ট্রাক্ট নেমস্পেস ডোমেন সকেটের উপর নির্ভর করে, যা ফাইলগুলির উপর নির্ভর না করে আপনার জন্য নাম অনুসারে সকেটগুলি ট্র্যাক করে রাখে, যা ডিমন সিগিল'ড হওয়ার পরেও আটকে রাখতে পারে। উদাহরণটি দেখায় যে লিনাক্স প্রক্রিয়াটি শেষ হয়ে যাওয়ার পরে সকেটটি মুক্ত করবে বলে মনে হয়।

তবে আমি লিনাক্সে সুনির্দিষ্ট ডকুমেন্টেশন খুঁজে পাই না যা বলে যে আবদ্ধ প্রক্রিয়াটি SIGKILL'd হলে লিনাক্স বিমূর্ত সকেটের সাথে ঠিক কী করে। কেউ কি জানে?

আরেকটি উপায় রাখুন, ঠিক কীভাবে অ্যাবস্ট্রাক্ট সকেটটি আবার ব্যবহারের জন্য মুক্ত করা হবে?

আমি পিআইডি ফাইল মেকানিজমটি অ্যাবস্ট্রাক্ট সকেটগুলির সাথে প্রতিস্থাপন করতে চাই না যতক্ষণ না এটি সমস্যা সমাধানে দৃitive়রূপে সমাধান করে।


3
আমি সরাসরি উত্তর দেয় এমন কিছুই পাচ্ছি না। তবে যেহেতু অ্যাবস্ট্রাক্ট সকেটগুলি সরানোর জন্য কোনও এপিআই নেই, তাই মনে হচ্ছে এগুলি কার্নেল দ্বারা স্বয়ংক্রিয়ভাবে পরিচালনা করতে হবে। সকেটটি খোলা থাকলে কোনও প্রক্রিয়া নেই, এটি দূরে চলে যাওয়া উচিত।
বার্মার

@ বারমার মেলা যথেষ্ট। একটি উত্তর হিসাবে এটি যুক্ত যত্ন?
সিভিফ্যান

আমি আরও সুনির্দিষ্ট তথ্য পছন্দ করতে চাই।
বার্মার

উত্তর:


5

হ্যাঁ, লিনাক্স স্বয়ংক্রিয়ভাবে বিমূর্ত সকেটগুলিকে "পরিস্কার করে" এমন পরিমাণে সাফ করে তোলে যা এমনকি এমনকি পরিষ্কার করাও বোঝায়। এখানে একটি ন্যূনতম কাজের উদাহরণ যা দিয়ে আপনি এটি যাচাই করতে পারবেন:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

int
main(int argc, char **argv)
{
  int s;
  struct sockaddr_un sun;

  if (argc != 2 || strlen(argv[1]) + 1 > sizeof(sun.sun_path)) {
    fprintf(stderr, "usage: %s abstract-path\n", argv[0]);
    exit(1);
  }

  s = socket(AF_UNIX, SOCK_STREAM, 0);
  if (s < 0) {
    perror("socket");
    exit(1);
  }
  memset(&sun, 0, sizeof(sun));
  sun.sun_family = AF_UNIX;
  strcpy(sun.sun_path + 1, argv[1]);
  if (bind(s, (struct sockaddr *) &sun, sizeof(sun))) {
    perror("bind");
    exit(1);
  }
  pause();
}

এই প্রোগ্রামটি চালান ./a.out /test-socket &, তারপরে চালান ss -ax | grep test-socket, এবং আপনি সকেটটি ব্যবহারে দেখতে পাবেন। তারপরে kill %./a.out, এবং ss -axদেখবে সকেটটি গেছে।

তবে যে কোনও ডকুমেন্টেশনে আপনি এই পরিষ্কার-সন্ধানটি আবিষ্কার করতে পারবেন না তা হ'ল এটি সত্যিকার অর্থে পরিষ্কার হচ্ছে না যে নন-অ্যাবস্ট্রাক্ট ইউনিক্স-ডোমেন সকেটগুলি পরিষ্কার করা দরকার। একটি নন-অ্যাবস্ট্রাক্ট সকেট আসলে একটি ইনোড বরাদ্দ করে এবং একটি ডিরেক্টরিতে একটি এন্ট্রি তৈরি করে, যা অন্তর্নিহিত ফাইল সিস্টেমে পরিষ্কার করা প্রয়োজন। বিপরীতে, কোনও টিসিপি বা ইউডিপি পোর্ট নম্বরের মতো একটি বিমূর্ত সকেট সম্পর্কে ভাবেন। অবশ্যই, আপনি যদি কোনও টিসিপি পোর্ট বাঁধেন এবং তারপরে প্রস্থান করেন, তবে টিসিপি পোর্টটি আবার মুক্ত হবে free তবে আপনি যে 16-বিট নম্বর ব্যবহার করেছেন সেগুলি এখনও বিমূর্তভাবে এবং সর্বদা ছিল। পোর্ট সংখ্যার নাম স্থান 1-65535 এবং কখনও পরিবর্তন হয় না বা পরিষ্কারের প্রয়োজন হয় না।

সুতরাং কেবলমাত্র টিসিপি বা ইউডিপি পোর্ট সংখ্যার মতো অ্যাবস্ট্রাক্ট সকেটের নামটি মনে করুন, সম্ভাব্য পোর্ট সংখ্যার বৃহত্তর সেট থেকে বেছে নেওয়া হয়েছে যা পথের নামের মতো দেখা যায় তবে তা নয়। আপনি একই পোর্ট নম্বরটি দু'বার বেঁধে রাখতে পারবেন না (বাদ দিয়ে SO_REUSEADDRবা SO_REUSEPORT)। তবে সকেটটি বন্ধ করে (স্পষ্টভাবে বা সুস্পষ্টভাবে সমাপ্ত করে) বন্দরটি মুক্ত করে, কিছুই পরিষ্কার করার জন্য বাকি নেই।


এটি ইতিমধ্যে হাঁসের পরীক্ষায় উত্তীর্ণ হয়েছে। পাইথনের মতো কিছু জিনিসের জন্য এটি দুর্দান্ত, তবে আমি লিনাক্স কার্নেলের বৈশিষ্ট্যগুলির জন্য আরও বেশি প্রত্যাশা করি। আপনার টিসিপি / ইউডিপি বন্দরগুলির উদাহরণগুলি ধরুন - বন্দরটি পুনরায় ব্যবহার করা যেতে পারে তখন সঠিকভাবে বর্ণনা করে প্রচুর ডকুমেন্টেশন রয়েছে।
সিভিফ্যান

2
এবং কেন যে ডকুমেন্টেশন বিমূর্ত সকেটের জন্য সমানভাবে প্রয়োগ হয় না? আপনার কি রেফারেন্স আছে? আরও ভাল প্রশ্ন হতে পারে যেখানে নন-অ্যাবস্ট্রাক্ট ইউনিক্স-ডোমেন সকেটের জন্য অতিরিক্ত ক্লিন-আপ জটিলতা নথিভুক্ত করা হয়েছে। আমার সিস্টেমে, এটি ইউনিক্সে রয়েছে (7) , যা বলে যে "লিনাক্স একটি বিমূর্ত নেমস্পেস সমর্থন করে যা ফাইল সিস্টেমের থেকে পৃথক।" সুতরাং আমার কাছে "ফাইল সিস্টেমের স্বাধীন" বলতে কোনও ফাইল-সিস্টেম-নির্দিষ্ট ক্লিনআপ বোঝায় না।
ব্যবহারকারী3188445

5

আমি এক বছর আগে এই প্রশ্নটি পোস্ট করেছিলাম এবং নিশ্চিত দলিলের অভাবে কখনই যথেষ্ট সন্তুষ্ট হইনি। আমি কোনো আপডেটের জন্য আবার লিনাক্স ডকুমেন্টেশন চেক চাই চিন্তা, এবং খুশি ছিল এই দেখতে :

বিমূর্ত সকেট

বিমূর্ত সকেটের জন্য সকেটের অনুমতিগুলির কোনও অর্থ নেই: একটি বিমূর্ত সকেটকে বাঁধাই করার সময় উমাস্ক (2) প্রক্রিয়াটির কোনও প্রভাব থাকে না এবং অবজেক্টের মালিকানা এবং অনুমতিগুলি পরিবর্তন করে (ফ্যাচাউন (2) এবং fchmod (2) এর মাধ্যমে কোনও প্রভাব পড়ে না সকেটের অ্যাক্সেসযোগ্যতা।

বিমূর্ত সকেটগুলি স্বয়ংক্রিয়ভাবে অদৃশ্য হয়ে যায় যখন সকেটের সমস্ত খোলার রেফারেন্স বন্ধ থাকে।

এছাড়াও, লিনাক্স ইন্টারফেস প্রোগ্রামিং দ্বারা মাইকেল Kerrisk প্রশ্ন জুড়ে (থেকে বিপরীত পোস্ট অন্য উত্তর ):

57.6 লিনাক্স বিমূর্ত সকেট নেমস্পেস

তথাকথিত অ্যাবস্ট্রাক্ট নেমস্পেস একটি লিনাক্স-নির্দিষ্ট বৈশিষ্ট্য যা আমাদের ফাইল সিস্টেমে নামটি তৈরি না করে একটি ইউনিক্স ডোমেন সকেটকে একটি নামের সাথে যুক্ত করতে দেয়। এটি কয়েকটি সম্ভাব্য সুবিধা দেয়:

  • ফাইল সিস্টেমে বিদ্যমান নামের সাথে সম্ভাব্য সংঘর্ষের বিষয়ে আমাদের চিন্তা করার দরকার নেই।
  • সকেট ব্যবহার শেষ করার পরে সকেটের পাথের নামটি লিঙ্কমুক্ত করার দরকার নেই। সকেট বন্ধ হয়ে গেলে বিমূর্ত নামটি স্বয়ংক্রিয়ভাবে সরানো হবে।
  • সকেটের জন্য আমাদের কোনও ফাইল-সিস্টেমের প্যাথনাম তৈরি করার দরকার নেই। এটি ক্রুট পরিবেশে কার্যকর হতে পারে বা যদি আমাদের কোনও ফাইল সিস্টেমে লেখার অ্যাক্সেস না থাকে।

একটি বিমূর্ত বাঁধাই তৈরি করতে, আমরা সূর্য_পাথ ক্ষেত্রের প্রথম বাইটটি নাল বাইট (\ 0) হিসাবে নির্দিষ্ট করি। [...]

আমি বিবেচনা করি যে @ ব্যবহারকারী3188445 এর উত্তর সহ, এই প্রশ্নটি খুব স্পষ্টভাবে পরিষ্কার করে।

এটি বলেছিল, এখানে এখনও একটি ধারণা তৈরি করা হয়েছে, যেগুলি প্রক্রিয়াগুলি সিগিল হবে সমস্ত খোলা সকেট বন্ধ হয়ে যাবে। এটি একটি যুক্তিসঙ্গত অনুমান বলে মনে হয়, তবে আমার কাছে এমন আচরণের সংজ্ঞা দেয় এমন ডকুমেন্টেশন নেই।


1
শেষ অনুচ্ছেদে পুনরায়: সকেটগুলি ফাইল বর্ণনাকারী এবং কোনও প্রক্রিয়া প্রস্থান করার সময় সমস্ত ওপেন ফাইল বর্ণনাকারী বন্ধ হয়ে যায়। ইশ। আরও সুনির্দিষ্টভাবে, একটি সকেট একটি ওপেন ফাইল, ওপেন ফাইলগুলি প্রায় পাস করা যায় যেমন শিশু প্রক্রিয়া দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত। সুতরাং SOCK_CLOEXECকোনও কোড (একটি লাইব্রেরি সহ) কখনও কাঁটাচামচ () + এক্সিকিউট () না করে আপনার সাথে সকেট কল করা নিশ্চিত করা উচিত । এক্সিকিউট () ছাড়াই কাঁটা () ব্যবহার করে অতিরিক্ত শিশু প্রক্রিয়া তৈরি করা কম সাধারণ; আপনি সম্ভবত এটি আগেই জানেন।
সোর্সজেদি

এটি লিঙ্কমুক্ত করা প্রয়োজন হয় না ... - ওম, যেহেতু কোনও পথের নাম নেই, এটি লিঙ্কমুক্ত করা সম্ভব নয়, কেবল অপ্রয়োজনীয় নয়।
ডোমেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.