/ Proc / ডিরেক্টরিতে আপনি বর্তমানে সক্রিয় প্রতিটি প্রক্রিয়ার একটি তালিকা পাবেন, কেবল আপনার পিআইডি এবং সম্পর্কিত সমস্ত ডেটা রয়েছে তা সন্ধান করুন। একটি ইন্টারেস্টিং তথ্য হ'ল fd / ফোল্ডার, আপনি বর্তমানে প্রক্রিয়া দ্বারা খোলার সমস্ত ফাইল হ্যান্ডেলারগুলি দেখতে পাবেন।
অবশেষে আপনি আপনার ডিভাইসে একটি প্রতীকী লিঙ্কটি খুঁজে পাবেন (/ dev / বা এমনকি / প্রোক / বাস / ইউএসবি / এর আওতায়), যদি ডিভাইসটি স্তব্ধ হয়ে থাকে তবে লিঙ্কটি মারা গেছে এবং এই হ্যান্ডেলটি রিফ্রেশ করা অসম্ভব হবে, প্রক্রিয়াটি অবশ্যই বন্ধ হবে এবং এটি আবার খুলুন (পুনরায় সংযোগ দিয়েও)
এই কোডটি আপনার পিআইডি-র লিঙ্কের বর্তমান অবস্থা পড়তে পারে
#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
int main() {
// the directory we are going to open
DIR *d;
// max length of strings
int maxpathlength=256;
// the buffer for the full path
char path[maxpathlength];
// /proc/PID/fs contains the list of the open file descriptors among the respective filenames
sprintf(path,"/proc/%i/fd/",getpid() );
printf("List of %s:\n",path);
struct dirent *dir;
d = opendir(path);
if (d) {
//loop for each file inside d
while ((dir = readdir(d)) != NULL) {
//let's check if it is a symbolic link
if (dir->d_type == DT_LNK) {
const int maxlength = 256;
//string returned by readlink()
char hardfile[maxlength];
//string length returned by readlink()
int len;
//tempath will contain the current filename among the fullpath
char tempath[maxlength];
sprintf(tempath,"%s%s",path,dir->d_name);
if ((len=readlink(tempath,hardfile,maxlength-1))!=-1) {
hardfile[len]='\0';
printf("%s -> %s\n", dir->d_name,hardfile);
} else
printf("error when executing readlink() on %s\n",tempath);
}
}
closedir(d);
}
return 0;
}
এই চূড়ান্ত কোডটি সহজ, আপনি লিঙ্ক্যাট ফাংশন দিয়ে খেলতে পারেন।
int
open_dir(char * path)
{
int fd;
path = strdup(path);
*strrchr(path, '/') = '\0';
fd = open(path, O_RDONLY | O_DIRECTORY);
free(path);
return fd;
}
int
main(int argc, char * argv[])
{
int odir, ndir;
char * ofile, * nfile;
int status;
if (argc != 3)
return 1;
odir = open_dir(argv[1]);
ofile = strrchr(argv[1], '/') + 1;
ndir = open_dir(argv[2]);
nfile = strrchr(argv[2], '/') + 1;
status = linkat(odir, ofile, ndir, nfile, AT_SYMLINK_FOLLOW);
if (status) {
perror("linkat failed");
}
return 0;
}