अंडर/proc/निर्देशिका के तहत आपको वर्तमान में सक्रिय प्रत्येक प्रक्रिया की एक सूची मिल जाएगी, बस अपने पीआईडी को ढूंढें और संबंधित सभी डेटा वहां हैं। एक इंटरस्टेस्टिंग जानकारी फ़ोल्डर fd/है, आपको वर्तमान में प्रक्रिया द्वारा खोले गए सभी फ़ाइल हैंडलर मिलेंगे।
आखिरकार आपको अपने डिवाइस (नीचे/dev/या यहां तक कि/proc/bus/usb /) के लिए एक प्रतीकात्मक लिंक मिलेगा, यदि डिवाइस लटकता है तो लिंक मर जाएगा और इस हैंडल को रीफ्रेश करना असंभव होगा, प्रक्रिया को बंद करने और इसे फिर से खोलने (यहां तक कि पुनर्संयोजन के साथ)
इस कोड को चाहिए इस अंतिम कोड सरल है अपने पीआईडी का लिंक वर्तमान स्थिति
#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;
}
पढ़ सकते हैं, आप linkat समारोह के साथ खेल सकते हैं।
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;
}
मुझे लगता है कि फ़ाइल की एक निर्देशिका निर्देशिका हटा दी गई है तो आपका दूसरा बिंदु समान रूप से लागू होता है। ऐसा क्या? –
मुझे एक चीज़ में रूचि है: यदि आप फ़ाइल को ओवरराइट करने के लिए सीपी कमांड का उपयोग करते हैं, तो क्या यह पहला मामला है या दूसरा मामला है? – xuhdev