কেন আরজিভি প্রোগ্রামের নাম অন্তর্ভুক্ত করে?


106

সাধারণ ইউনিক্স / লিনাক্স প্রোগ্রামগুলি কমান্ড লাইন ইনপুটগুলিকে আর্গুমেন্ট গণনা ( int argc) এবং একটি আর্গুমেন্ট ভেক্টর ( char *argv[]) হিসাবে গ্রহণ করে। এর প্রথম উপাদানটি argvহ'ল প্রোগ্রামের নাম - এরপরে আসল যুক্তি।

প্রোগ্রামের নামটি কার্যকর হিসাবে আর্গুমেন্ট হিসাবে কেন দেওয়া হয়? প্রোগ্রামগুলির নিজস্ব নাম ব্যবহারের কোনও উদাহরণ রয়েছে (সম্ভবত কোনওরকম execপরিস্থিতি)?


6
এমভি এবং সিপি মত?
আরচেমার

9
ডিবিয়ান অন shসিমেলিংক হয় dash। তারা আলাদা আচরণ করে, যখন হিসাবে shবা হিসাবে ডাকা হয়dash
Motte001

21
@ আলেকজমগুরা যদি আপনি busybox(রেসকিউ-ডিস্ক এবং এরকম সাধারণ) মতো কিছু ব্যবহার করেন তবে বেশ কিছু (সিপি, এমভি, আরএম, এলএস, ...) ব্যস্তবক্সের প্রতীকী লিঙ্ক।
বার্ড কোপ্পেরুদ

11
আমি এই খোঁজার করছি সত্যিই উপেক্ষা করা কঠিন, তাই আমি এটা বলবো: (আপনি সম্ভবত মানে "গনুহ" প্রোগ্রাম gcc, bash, gunzipঅপারেটিং সিস্টেম ... বাকি অধিকাংশ,), যেমন লিনাক্স মাত্র কার্নেল হয়।
wizzwizz4

10
@ wizzwizz4 "টিপিক্যাল ইউনিক্স / লিনাক্স প্রোগ্রামগুলি" এর সাথে কী সমস্যা? আমি এটি "ইউনিক্স / লিনাক্সে চলমান সাধারণ প্রোগ্রামগুলির মতো" পড়েছি। কিছু নির্দিষ্ট জিএনইউ প্রোগ্রামগুলিতে আপনার বিধিনিষেধের চেয়ে এটি অনেক ভাল। ডেনিস রিচি অবশ্যই কোনও জিএনইউ প্রোগ্রাম ব্যবহার করছিল না। বিটিডাব্লিউ দ্য হার্ট কার্নেলটি জিএনইউ প্রোগ্রামের একটি উদাহরণ যার মূল ফাংশন নেই ...
rudimeier

উত্তর:


122

শুরু করার জন্য, নোট করুন যে argv[0]অগত্যা প্রোগ্রামের নাম নয়। এটা কি আহ্বানকারী রাখে হল argv[0]এর execveসিস্টেম কল (যেমন দেখুন স্ট্যাক ওভারফ্লো উপর এই প্রশ্ন )। (অন্যান্য সমস্ত রূপগুলি execসিস্টেম কল নয় তবে এতে ইন্টারফেস রয়েছে execve))

ধরুন, উদাহরণস্বরূপ, নিম্নলিখিত (ব্যবহার করে execl):

execl("/var/tmp/mybackdoor", "top", NULL);

/var/tmp/mybackdoorযা কার্যকর করা হয় তবে argv[0]সেট করা হয় topএবং এটিই psবা (বাস্তব) প্রদর্শিত topহবে। এ সম্পর্কে আরও জানতে এই উত্তরটি উত্তর ও এল এস এ দেখুন।

এই সব সরাইয়া সেটিং: মত অভিনব ফাইল সিস্টেম আবির্ভাব আগে /proc, argv[0]একটি প্রক্রিয়া নিজস্ব নাম সম্পর্কে জানতে জন্য একমাত্র উপায়। কি জন্য ভাল হবে?

  • বেশ কয়েকটি প্রোগ্রাম তাদের নামটির উপর নির্ভর করে তাদের আচরণটি কাস্টমাইজ করে যার নামে তাদের ডাকা হত (সাধারণত প্রতীকী বা শক্ত লিঙ্কগুলি উদাহরণস্বরূপ ব্যাসিবক্সের ইউটিলিটিস ; এই প্রশ্নের অন্যান্য উত্তরে আরও কয়েকটি উদাহরণ সরবরাহ করা হয়)।
  • অধিকন্তু, সার্ভিস, ডেমন এবং অন্যান্য প্রোগ্রাম যা সিসলোগের মাধ্যমে লগ হয় প্রায়শই তাদের নাম লগ এন্ট্রিগুলিতে প্রিন্ট করে; এটি ছাড়া ইভেন্ট ট্র্যাকিং অপরিবর্তনীয় হয়ে উঠবে।

18
যেমন প্রোগ্রাম উদাহরণ হল bunzip2, bzcatএবং bzip2, যার জন্য প্রথম দুই তৃতীয় এক symlinks হয়।
রুস্লান

5
@ রুসলান আকর্ষণীয়ভাবে zcatএকটি সিমিলিংক নয়। তারা পরিবর্তে শেল স্ক্রিপ্ট ব্যবহার করে এই কৌশলটির ডাউনসাইডগুলি এড়াতে পারে বলে মনে হয়। তবে তারা একটি সম্পূর্ণ --helpআউটপুট মুদ্রণ করতে ব্যর্থ হয়েছে কারণ যে কেউ জিজিপ-এ বিকল্প যুক্ত করেছেন তারাও জ্যাক্যাট বজায় রাখতে ভুলে গেছেন।
rudimeier

1
যতক্ষণ আমি মনে করতে পারি, জিএনইউ কোডিং মানগুলি প্রোগ্রামের আচরণ পরিবর্তন করতে আরগভি [0] ব্যবহারকে নিরুৎসাহিত করেছে ( বর্তমান সংস্করণে "ইন্টারফেসের জন্য সাধারণভাবে" বিভাগ )। gunzipএটি একটি historicalতিহাসিক ব্যতিক্রম।

19
ব্যস্তবক্স আরেকটি দুর্দান্ত উদাহরণ। 308 টি বিভিন্ন নাম দিয়ে বিভিন্ন কমান্ড চাওয়ার
Pepijn Schmitz

2
অনেকগুলি, আরও অনেক প্রোগ্রাম argv[0]তাদের নাম / হার্ড কোডিংয়ের পরিবর্তে তাদের ব্যবহার / সহায়তা আউটপুটগুলিতে ইনজেক্ট করে । কিছু পূর্ণ, কিছু শুধু বেস নাম।
স্পেকট্রা

62

প্রচুর, প্রচুর পরিমাণে, পর্যাপ্ত:

  • ব্যাশ রান POSIX মোড যখন argv[0]হয় sh। এটি argv[0]শুরু হওয়ার সাথে সাথে লগইন শেল হিসাবে চলে -
  • যখন হিসাবে চালানো তেজ ভিন্নভাবে আচরণ করবে vi, view, evim, eview, ex, vimdiff, ইত্যাদি
  • ব্যস্তবক্স, ইতিমধ্যে উল্লিখিত হিসাবে।
  • Init যেমন systemd হল সহ সিস্টেমের সালে shutdown, rebootইত্যাদি হয় করতে symlinkssystemctl
  • ইত্যাদি।

7
আর একটি হ'ল sendmailএবং mail। প্রতি একক ইউনিক্স এমটিএ এই দুটি কমান্ডের জন্য একটি সিমিলিংক নিয়ে আসে এবং এটি যখন ডাকা হয় তখন মূল আচরণটি অনুকরণ করার জন্য ডিজাইন করা হয়, মানে যে কোনও ইউনিক্স প্রোগ্রাম যাতে মেল প্রেরণের প্রয়োজন হয় তারা ঠিক কীভাবে এটি করতে পারে তা জানে।
শাদুর

4
অন্য একটি সাধারণ কেস: testএবং [: আপনি যখন প্রাক্তনকে কল করেন তবে এটি শেষ তর্কটি হলে কোনও ত্রুটি পরিচালনা করে ]। (প্রকৃত দেবিয়ান স্থিতিশীল এই কমান্ড দুটি পৃথক প্রোগ্রাম, কিন্তু পূর্ববর্তী সংস্করণ এবং ম্যাকও এখনও একই প্রোগ্রাম ব্যবহার করে)। এবং tex, latexএবং আরও: বাইনারি একই, তবে এটি কীভাবে ডাকা হয়েছিল তা সন্ধান করে এটি সঠিক কনফিগারেশন ফাইলটি চয়ন করে । initঅনুরূপ.
গিয়াকোমো ক্যাটেনাজি

4
সম্পর্কিত, [শেষ যুক্তিটি না হলে এটিকে ত্রুটি হিসাবে বিবেচনা করে ]
চ্যানার

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

@ জো হ্যাঁ, এই শব্দটি বোঝাতেই এই উদ্দেশ্যটি প্রকাশ করা হয়েছে (প্রশ্ন: "সেখানে কি কিছু আছে ...?" এ: "প্রচুর: ...")
মুড়ু

34

ঐতিহাসিকভাবে, argvশুধু কমান্ড এর "শব্দ" করার পয়েন্টার একটি অ্যারের, তাই এটি ইন্দ্রিয় প্রথম "শব্দ", যা প্রোগ্রামের নাম হতে হবে দিয়ে শুরু করে তোলে।

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

সম্পাদনা করুন : অনুরোধ অনুসারে ইউনিক্স ১ ম সংস্করণের রেফারেন্স

One থেকে উদাহরণ দেখতে পারেন প্রধান ফাংশন ccযে argcএবং argvইতিমধ্যে ব্যবহার করা হয়েছে। শেল থেকে কপি আর্গুমেন্ট parbufভিতরে newargলুপ অংশ, যখন আর্গুমেন্ট হিসাবে একই ভাবে কমান্ড নিজেই চিকিত্সা। (অবশ্যই, পরে এটি কেবল প্রথম যুক্তিই সম্পাদন করে, যা আদেশের নাম)। দেখে মনে হচ্ছে execvএবং আত্মীয়দের তখন নেই।


1
এই ব্যাক আপ রেফারেন্স যোগ করুন।
লেসমানা

দ্রুত স্কিমিং থেকে, execকার্যকর করতে কমান্ডের নাম এবং চর পয়েন্টারগুলির একটি শূন্য-সমাপ্তির অ্যারে নেয় ( minnie.tuhs.org/cgi-bin/utree.pl?file=V1/u0.s এ সেরা দেখা যায় , যেখানে execলাগে লেবেল 2 এবং লেবেল 1, এবং লেবেলে রেফারেন্স 2:উপস্থিত হয় etc/init\0, এবং 1:লেবেলে 2 লেবেলের একটি রেফারেন্স উপস্থিত হয়, এবং একটি শূন্যের সমাপ্তি শূন্য), যা মূলত execveআজকে বিয়োগফল করে envp
নিনজালজ

1
execvএবং execl"চিরকাল" (যেমন, 1970 এর দশকের গোড়া থেকে শুরু করে) অস্তিত্ব execvছিল - এটি ছিল একটি সিস্টেম কল এবং execlএটি একটি লাইব্রেরির ফাংশন যা একে ডাকে।   execveতখন পরিবেশ ছিল না কারণ তখন পরিবেশ ছিল না। পরে পরিবারের অন্যান্য সদস্যদেরও যুক্ত করা হয়েছিল।
জি ম্যান

@ জি-ম্যান আপনি কি execvআমার সাথে সংযুক্ত ভি 1 সূত্রের দিকে ইঙ্গিত করতে পারবেন ? উৎসুক.
dirkt

22

ব্যবহারের ক্ষেত্রে:

আপনি প্রোগ্রামের আচরণটি পরিবর্তন করতে প্রোগ্রামের নামটি ব্যবহার করতে পারেন ।

উদাহরণস্বরূপ, আপনি প্রকৃত বাইনারিতে কিছু সিমলিংক তৈরি করতে পারেন।

একটি বিখ্যাত উদাহরণ যেখানে এই কৌশলটি ব্যবহৃত হয় তা হ'ল ব্যস্তবক্স প্রকল্প যা এটিতে কেবল একটি একক বাইনারি এবং অনেকগুলি সিমলিংক ইনস্টল করে। (এলএস, সিপি, এমভি, ইত্যাদি)। স্টোরেজ স্পেস সংরক্ষণ করার জন্য তারা এটি করছে কারণ তাদের লক্ষ্যগুলি ছোট এমবেডড ডিভাইস।

এটি ব্যবহার setarch-লিনাক্স থেকেও ব্যবহৃত হয় :

$ ls -l /usr/bin/ | grep setarch
lrwxrwxrwx 1 root root           7 2015-11-05 02:15 i386 -> setarch
lrwxrwxrwx 1 root root           7 2015-11-05 02:15 linux32 -> setarch
lrwxrwxrwx 1 root root           7 2015-11-05 02:15 linux64 -> setarch
-rwxr-xr-x 1 root root       14680 2015-10-22 16:54 setarch
lrwxrwxrwx 1 root root           7 2015-11-05 02:15 x86_64 -> setarch

এখানে তারা এই কৌশলটি মূলত অনেকগুলি সদৃশ উত্স ফাইলগুলি এড়াতে বা উত্সগুলিকে আরও পঠনযোগ্য রাখার জন্য ব্যবহার করছেন।

আরেকটি ব্যবহারের ক্ষেত্রে একটি প্রোগ্রাম হবে যা রানটাইমের সময় কিছু মডিউল বা ডেটা লোড করা দরকার। প্রোগ্রামের পাথ থাকা আপনাকে প্রোগ্রামের অবস্থানের সাথে সম্পর্কিত কোনও পাথ থেকে মডিউলগুলি লোড করতে সক্ষম করে

এছাড়াও অনেক প্রোগ্রাম প্রোগ্রামের নাম সহ ত্রুটি বার্তা প্রিন্ট করে

কেন :

  1. কারণ এটি পসিক্স কনভেনশন ( man 3p execve):

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

  1. এটি সি স্ট্যান্ডার্ড (কমপক্ষে সি 99 এবং সি 11):

যদি আরগিসির মান শূন্যের চেয়ে বেশি হয় তবে আরজিভি [0] দ্বারা নির্দেশিত স্ট্রিং প্রোগ্রামটির নাম উপস্থাপন করে; আরজিভি [0] [0] প্রোগ্রামটির নাম হোস্ট পরিবেশ থেকে উপলব্ধ না হলে নাল অক্ষর হবে।

নোট করুন সি স্ট্যান্ডার্ডটি "প্রোগ্রামের নাম" ফাইল নাম নয় "বলেছে।


3
আপনি যদি অন্য একটি সিমলিংক থেকে সিলেমিংকে পৌঁছান তবে এটি কি ভাঙবে না?
মেহরদাড

3
@ মেহরদাদ, হ্যাঁ এটিই নিম্নমুখী এবং ব্যবহারকারীর জন্য বিভ্রান্তিকর হতে পারে।
rudimeier

@ রূডিমেয়ার: আপনার 'কেন' আইটেমগুলি আসলে কারণ নয়, এগুলি কেবল একটি "হোমঙ্কুলাস", অর্থাত্ কেন এটি স্ট্যান্ডার্ডের ক্ষেত্রে এটি হওয়া প্রয়োজন তা এই প্রশ্নটি করে।
einpoklum

@ আইনপোকলুম ওপির প্রশ্ন ছিল: প্রোগ্রামটির নাম কার্যকর করাতে কেন দেওয়া হয়? আমি উত্তর দিয়েছি: কারণ পসিক্স এবং সি স্ট্যান্ডার্ড আমাদের এটি করতে বলে। আপনি কীভাবে মনে করেন যে এটি আসলে একটি কারণ নয় ? আমি যে দস্তাবেজের উদ্ধৃতি দিয়েছি সেগুলি যদি না থাকে তবে সম্ভবত অনেক প্রোগ্রাম প্রোগ্রামের নামটি পাস না করে।
rudimeier

ওপি কার্যকরভাবে জিজ্ঞাসা করছে "পসিক্স এবং সি স্ট্যান্ডার্ড কেন এটি করতে বলে?" অনুমোদিত শব্দটি একটি বিমূর্ত স্তরে ছিল, তবে এটি স্পষ্ট বলে মনে হয়। বাস্তবিকভাবে, জানার একমাত্র উপায় হ'ল প্রবর্তকদের জিজ্ঞাসা করা।
ব্যবহারকারী 2338816

21

প্রোগ্রামগুলি কীভাবে তাদের ডাকা হত তার উপর নির্ভর করে তাদের আচরণের পরিবর্তন করে, আমি argv[0]কোনও প্রোগ্রামের ব্যবহার মুদ্রণে দরকারী বলে মনে করি :

printf("Usage: %s [arguments]\n", argv[0]);

এটি ব্যবহারের বার্তাটি সর্বদা সেই নামটি ব্যবহার করে যার মাধ্যমে এটি ডাকা হত causes প্রোগ্রামটির নতুন নামকরণ করা হলে এর ব্যবহারের বার্তা এটির সাথে পরিবর্তিত হয়। এমনকি এটি যে পথটির সাথে ডাকা হয়েছিল তাও অন্তর্ভুক্ত করে:

# cat foo.c 
#include <stdio.h>
int main(int argc, char **argv) { printf("Usage: %s [arguments]\n", argv[0]); }
# gcc -Wall -o foo foo.c
# mv foo /usr/bin 
# cd /usr/bin 
# ln -s foo bar
# foo
Usage: foo [arguments]
# bar
Usage: bar [arguments]
# ./foo
Usage: ./foo [arguments]
# /usr/bin/foo
Usage: /usr/bin/foo [arguments]

এটি একটি দুর্দান্ত স্পর্শ, বিশেষত ছোট বিশেষ উদ্দেশ্যে সরঞ্জামগুলি / স্ক্রিপ্টগুলির জন্য যা পুরো জায়গা জুড়ে থাকতে পারে।

এটি জিএনইউ সরঞ্জামগুলিতেও সাধারণ অনুশীলন বলে মনে হয়, lsউদাহরণস্বরূপ দেখুন:

% ls --qq
ls: unrecognized option '--qq'
Try 'ls --help' for more information.
% /bin/ls --qq
/bin/ls: unrecognized option '--qq'
Try '/bin/ls --help' for more information.

3
+1 টি। আমি একই পরামর্শ দিতে যাচ্ছি। আশ্চর্যের বিষয় যে এতগুলি লোক আচরণ পরিবর্তন করার দিকে মনোনিবেশ করে এবং সম্ভবত সবচেয়ে সুস্পষ্ট এবং অনেক বেশি ব্যাপক ব্যবহার উল্লেখ করতে ব্যর্থ হয়।
ভী

5

এক executes প্রোগ্রাম টাইপিং: program_name0 arg1 arg2 arg3 ...

সুতরাং শেলটি ইতিমধ্যে টোকেনকে ভাগ করে নেওয়া উচিত এবং প্রথম টোকেন ইতিমধ্যে প্রোগ্রামটির নাম। এবং বিটিডাব্লু তাই প্রোগ্রামের পাশ এবং শেলের একই সূচক রয়েছে।

আমি মনে করি এটি কেবল একটি সুবিধার কৌশল ছিল (খুব প্রথম দিকে), এবং আপনি অন্যান্য উত্তরে দেখেন যে এটিও খুব সহজ ছিল, সুতরাং এই traditionতিহ্যটি অব্যাহত ছিল এবং এপিআই হিসাবে সেট করা হয়েছিল।


4

মূলত, আরজিভিতে প্রোগ্রামের নাম অন্তর্ভুক্ত থাকে যাতে আপনি ত্রুটি বার্তাগুলি লিখতে পারেন prgm: file: No such file or directoryযা এই জাতীয় কিছু দিয়ে প্রয়োগ করা হবে:

    fprintf( stderr, "%s: %s: No such file or directory\n", argv[0], argv[1] );

2

এর প্রয়োগের আর একটি উদাহরণ হ'ল এই প্রোগ্রামটি, যা নিজেকে ... এর সাথে প্রতিস্থাপন করে, যতক্ষণ না আপনি কিছু টাইপ করেন না y

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

int main (int argc, char** argv) {

  (void) argc;

  printf("arg: %s\n", argv[1]);
  int count = atoi(argv[1]);

  if ( getchar() == 'y' ) {

    ++count;

    char buf[20];
    sprintf(buf, "%d", count);

    char* newargv[3];
    newargv[0] = argv[0];
    newargv[1] = buf;
    newargv[2] = NULL;

    execve(argv[0], newargv, NULL);
  }

  return count;
}

স্পষ্টতই, আকর্ষণীয় উদাহরণ হিসাবে একরকম সংশ্লেষযুক্ত, তবে আমি মনে করি এটির আসল ব্যবহার থাকতে পারে - উদাহরণস্বরূপ, একটি স্ব-আপডেটিং বাইনারি, যা নিজের মেমরির স্থানটি নিজের নিজের নতুন সংস্করণ দিয়ে পুনরায় লেখায় যা এটি ডাউনলোড বা পরিবর্তিত হয়েছিল।

উদাহরণ:

$ ./res 1
arg: 1
y
arg: 2
y
arg: 3
y
arg: 4
y
arg: 5
y
arg: 6
y
arg: 7
n

7 | $

উত্স, এবং আরও কিছু তথ্য


অভিনন্দন 1000 এ পৌঁছে দেওয়ার জন্য
জি-ম্যান

0

প্রোগ্রামটি পাথ হ'ল argv[0], যাতে প্রোগ্রামটি ইনস্টল ডিরেক্টরি থেকে কনফিগারেশন ফাইল ইত্যাদি পুনরুদ্ধার করতে পারে।
এটি ছাড়া অসম্ভব হবে argv[0]


2
এটি খুব ভাল ব্যাখ্যা নয় - এর কারণ হিসাবে আমরা (char *path_to_program, char **argv, int argc)উদাহরণস্বরূপ
কোনও কিছুর

আমি যতদূর জানি, সবচেয়ে প্রোগ্রাম একটি প্রমিত অবস্থান থেকে কনফিগারেশন টান ( ~/.<program>, /etc/<program, $XDG_CONFIG_HOME) এবং পারেন একটি প্যারামিটার নিতে এটি পরিবর্তন বা কম্পাইল-টাইম বিকল্পটি বাইনারিতে একটি ধ্রুবক মধ্যে bakes আছে।
জিয়াং চিয়ামিভ

0

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

থেকে ccache man পৃষ্ঠা , "সেখানে ccache ব্যবহার করতে দুটি উপায় আছে। আপনি পূর্বে ভী পারেন পারেন আপনার সংকলন ccache সঙ্গে কমান্ড অথবা আপনি একটি সিম্বলিক লিঙ্ক (কম্পাইলার নামকরণ) ccache করতে। প্রথম পদ্ধতি তৈরি করে ccache কম্পাইলার হিসাবে ছদ্মবেশ দেওয়া যাবে আপনি যদি কেবল ccache চেষ্টা করে দেখতে চান বা কিছু নির্দিষ্ট প্রকল্পের জন্য এটি ব্যবহার করতে চান তবে এটি সবচেয়ে সুবিধাজনক।

সিমলিংক পদ্ধতিতে এই আদেশগুলি চালানো জড়িত:

cp ccache /usr/local/bin/
ln -s ccache /usr/local/bin/gcc
ln -s ccache /usr/local/bin/g++
ln -s ccache /usr/local/bin/cc
ln -s ccache /usr/local/bin/c++
... etc ...

... এর প্রভাব হ'ল ccache কে এমন কোনও কমান্ড ছিনিয়ে নিতে দেওয়া যা অন্যথায় সংকলকগুলিতে চলে যায়, সুতরাং ccache কে একটি ক্যাশেড ফাইল ফেরত দিতে বা প্রকৃত সংকলকটিতে আদেশটি সরিয়ে দেয়।

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