http://programming-fr34ks.net/forum/...?showtopic=325
مش عارف احطها فين ؟؟ بس اهيت !
كود بسيط عارف انه موجود في كل الكتب بس حيشرح الموضوع ببساطه
كود PHP:
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>

int main(int argc char **argv)
{
        if(!
argv[1])
        {
                
printf("filllllllle!\n");
                
_exit(0);
        }

        
int fd;
        
struct flock lock;


        
printf("opening\n");
        
fd open(argv[1] , O_WRONLY);
        
printf("locking\n");
        
memset(&lock  sizeof(lock));
        
lock.l_type F_WRLCK;
        
fcntl(fd F_SETLKW , &lock);

        
printf("locked hit enter\n");

        
getchar();

        
lock.l_type F_UNLCK;
        
fcntl(fd F_SETLKW , &lock);
        
printf("unlocked\n");
        
close(fd);
        return 
0;

قفل ال file مش إلزامي = mandatory يعني مش حتمنع كللل البروسيس من access علي الفيل دوت
لكن ديت advisory يعني مجرد door زي مانا قلت
تخيلها انها مجردد باب تقدر منه تدخل الي انت عايزه علي الملف وتوقف الي انت عايزه عن الملف !
مش حشرح codes حقول كام حاجه كمان اخر يوم بقي :angry_red:
/proc/locks
/proc/[pid]/cmdline

كده تمام يالا باي

/proc/locks تحتوي علي كل الملفات الي عملت lock علي اي file وتبتقولك النوع مثال
[email protected]:~/Desktop/linux.programming/flock# ./lock a7a
opening
locking
locked hit enter
افتح session تاني او shell تاني ومنه اعمل
[email protected]:~/Desktop/linux.programming/flock# cat /proc/locks
1: POSIX ADVISORY WRITE 4574 03:08:2098439 0 EOF
الكوماند بالنتيجه بيقدم نوع ال lock و ايه ال lock r/w ? وال process id الي عملت ال lock
اول سطر هو اخر عمليه تم تنفيذها
ناخد ال pid
4574

ps 4574
[email protected]:~/Desktop/linux.programming/flock# ps 4574
PID TTY STAT TIME COMMAND
4574 pts/1 S+ 0:00 ./lock fuck
واديه جابلك ال command
في طرق كتير تجيب بيها مسار الكوماند بس انا حقول الي تحت ال proc
cat /proc/4574/cwd
cwd = command working directory
جميل نستخدم readlink
وادي كود يجيبلك path ال command الي عمل ال lock

كود PHP:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>

int main(int argc char **argv)
{
        
int     pid;
        
char    path[BUFSIZ];
        
char    link[BUFSIZ];
        
int     z;

        if(!
argv[1])
        {
                
printf("usage %s process_id\n");
                
_exit(0);
        }

        
pid atoi(argv[1]);

        
sprintf(path ,"/proc/%d/cwd",pid);

        
printf("Process /proc path %s\n",path);

        
readlink(path link BUFSIZ);
        
link[z] = '\x0';
        
printf("command real address %s\n",link);

        return 
0;

[email protected]:~/Desktop/linux.programming/proc# ./get_link 4574
Process /proc path /proc/4574/cwd
command real address /root/Desktop/linux.programming/flock
في خطوه واحده تختصر كل الكلام دوت ب readlink command
بس يبقي لزمة حط الموضوع في قسم البرمجه ايه !
toast