int main{ pid_t pid; pid = fork(); if (pid < 0) { exit(1); } else if (pid == 0) { execle(".\/pktctl.exe", "pktctl.exe", "-a","block in on eth0 proto tcp from 61.135.196.21 port = 80 to 192.168.1.146 port > 1023", (char *)0, NULL); } if (waitpid(pid, NULL, 0) < 0) exit(1); return 0; }
适用性: 1)在linux中运行正确;
2)在window中运行错误(因为是linux的系统调用)。
3)在cygwin下gcc编译,从cygwin的bash和window中双击均能运行正确;
4)没有测试在cygwin下gcc-3 -mno-cygwin编译!
2、方法B:用long getcwd(char *buf, unsigned long size);
#include <stdio.h> #include <dir.h> int main() { char buffer[MAXPATH]; getcwd(buffer, MAXPATH); printf( "The current directory is: %s ", buffer); return 0; }#include <dir.h> 应该依编程者的环境而定: 在TC2.9是#include <dir.h> ; VC6.0定义在#include<direct.h>头文件中; 在qt4.5下是#include<unistd.h>; VS2008下是#include<direct.h>;
适用性:1)在window下运行正确,是绝对路径。
2)在linux下运行正确,是绝对路径。
3)在cygwin下gcc正常编译,在cygwin的bash下能用,双击生成的exe文件出现段内存错误!
4)在cygwin 下gcc-3 -mno-cygwin 编译,双击生成的exe和在cygwin的bash下运行,均能得到正确结果;
3、方法C:GetCurrentDirectory
string GetModuleFolderName() { TCHAR szFolderName[MAX_PATH]; GetModuleFileName(_AtlBaseModule.m_hInstResource, szFolderName, sizeof(szFolderName)); (_tcsrchr(szFolderName,'\\'))[1] = 0; return szFolderName; }适用性:1)在window下使用,得到绝对路径;
2)没有测试从window移植到linux下!
4、方法D:readlinK() /proc/sefl/exe
int main() { char buf[256]; char ptr[256]; int npath; sprintf(ptr,"/proc/%d/exe",getpid()); npath=readlink(ptr,buf,sizeof(buf)); if(npath==-1) { printf("readlink error:%s \n",ptr); } else { buf[npath]='\0'; printf("current :%s\n",buf); } return 0; }
适用性:1)在linxu获得绝对路径;
2)在cygwin下gcc编译的程序,在cygwin的bash下是绝对路径,在window中双击只是一个上层目录的标示;例如:C:/about/abcd/a.exe 只显示/abcd/a.exe
3)在cygwin下gcc-3 -mno-cygwin编译,会报错,编译不通过!